我刚刚遇到一些令我困惑的代码;我想澄清两种变化。
示例1:
public String getFilepath(){
final File file = new File(this.folder, this.filename);
return file.getAbsolutePath();
}
宣布file
“final
”的目的是什么?由于Java原语是按值传递的,而getAbsolutePath()
只是返回String
,因此该变量在另一方(调用方法)不会是final
,是吗?由于file
变量仅存在于这两行的范围内,因此我无法真正看到final
关键字的任何用途。有什么我想念的吗?有人看到这样做的理由吗?
示例2:
public String getFilepath(){
final File file = new File(this.folder, this.filename);
return file;
}
因为这里正在返回实际对象...这是否意味着file
变量在另一侧将是常量/ final
...?它似乎没有意义。
一般来说,在我看来,你传递一个变量,没有它的访问类型。在中,我可以在一个带有private
get函数的函数中有一个public
变量来返回它 - 但是通过调用函数接收它的变量必须指定一个访问修饰符。因此,如果它指定public
,则返回的变量将在该范围内为public
。如果它指定private
,则返回的变量将在该范围内为private
。与final
有区别吗?变量的“恒定性”是否可以传递?考虑到我对Java的了解,这让我觉得不太可能。
或者我完全忽略了这一点,上述代码中final
关键字还有其他目的吗?
修改
我与编写代码的原始开发人员一起回来了,他说他只放了final
关键字,因为他原本以为这个方法要长得多,并希望确保文件保持不变始终。他还说,他通常会声明不应该更改为final
的变量,作为一项规则全面而且原则上 - 这一点都是下面提到的答案。因此,出于标准原因,我似乎过多地阅读了一个简单的额外关键字。谢谢大家!
答案 0 :(得分:15)
final
只意味着本地引用file
将是不可变的。它在方法之外没有任何意义。一些编码约定主张所有变量都是最终的,除非它们需要是可变的,所以当有人遵循这样的指导时你会看到类似的代码。
答案 1 :(得分:3)
有些人可能会告诉你,使用final有一个性能上的好处,但这绝不是最终证明的。
final
关键字的主要好处是程序员可以指示不应更改类,方法或字段。
请记住,声明变量final
不会使引用的对象不可变。它只是意味着变量不能重新分配它的值。您仍然可以运行可能在内部更改file
对象的变量File
的方法。
在您提供的两种方法中,我认为制作file
变量final
并不重要。除非需要修改,否则一些代码约定主张创建所有变量final
。有些人不赞成这一点。我认为它是precautionary principle的变体。