Java中传递的最终变量是否最终保留在最终?

fro*_*die 8 java final constants return-value parameter-passing

我刚刚遇到一些令我困惑的代码; 我想澄清两种变化.

例1:

public String getFilepath(){
        final File file = new File(this.folder, this.filename);
        return file.getAbsolutePath();
    }
Run Code Online (Sandbox Code Playgroud)

宣布file" final" 的目的是什么?由于Java原语是按值传递的,并且getAbsolutePath()只是返回a String,因此变量不会final在另一端(调用方法),是吗?由于file变量只存在于这两行的范围内,因此我无法真正看到该final关键字的任何用途.有什么我想念的吗?有人看到这样做的理由吗?

例2:

public String getFilepath(){
        final File file = new File(this.folder, this.filename);
        return file;
    }
Run Code Online (Sandbox Code Playgroud)

因为这里正在返回实际对象......这是否意味着file变量将是恒定的/ final在另一侧......?它似乎没有意义.

一般来说,在我看来,你传递一个变量,没有它的访问类型.在中,我可以private在一个带有publicget函数的函数中有一个变量返回它 - 但是通过调用函数接收它的变量必须指定一个访问修饰符.因此,如果它指定public,则返回的变量将public在该范围内.如果指定private,则返回的变量将private在该范围内.有什么区别final吗?变量的"恒定性"是否可以传递?考虑到我对Java的了解,这让我觉得不太可能.

或者我完全忽略了这一点final,上述代码中关键字还有其他目的吗?

编辑:

我与编写代码的原始开发人员进行了核对,他说他只是将final关键字放入,因为他原本以为该方法会更长,并希望确保文件始终保持不变.他还说,他一般都会声明不应该改变的变量final,作为一项全面的规则和原则 - 这两点都是下面提到的答案.因此,出于标准原因,我似乎过多地阅读了一个简单的额外关键字.感谢大家!

Kri*_*ris 15

final在这种情况下,只意味着本地引用file将是不可变的.它在方法之外没有任何意义.一些编码约定主张所有变量都是最终的,除非它们需要是可变的,所以当有人遵循这样的指导时你会看到类似的代码.

  • 我说_reference_文件是不可变的.即你无法将'file'指向另一个'File'对象.这正是'final'关键字在Java中的含义.参考不能改变.不可变这个词只意味着无法改变的东西.它可以在许多情况下使用. (6认同)
  • 我知道这是挑剔......但我只是想提一下"不可变"可能不是最好的单词选择,因为所有的字符串在Java中都是不可变的.不过,我确实明白你的意思 (3认同)

Dan*_*umb 4

有些人可能会告诉您使用 Final 会带来性能优势,但这并没有得到最终证明。

该关键字的主要好处final是让程序员指示不应更改类、方法或字段。

请记住,声明变量final并不会使引用的对象变得不可变。它只是意味着该变量不能重新分配其值。file您仍然可以运行可以在内部更改对象的变量的方法File

在您提供的两种方法中,我认为创建变量没有任何file价值final。一些代码约定提倡使所有变量final除非需要修改。有些人不同意这一点。我认为这是预防原则的一种变体。