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

时间:2010-02-19 15:02:30

标签: java return-value final parameter-passing constants

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

示例1:

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

宣布filefinal”的目的是什么?由于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的变量,作为一项规则全面而且原则上 - 这一点都是下面提到的答案。因此,出于标准原因,我似乎过多地阅读了一个简单的额外关键字。谢谢大家!

2 个答案:

答案 0 :(得分:15)

在这种情况下,

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

答案 1 :(得分:3)

有些人可能会告诉你,使用final有一个性能上的好处,但这绝不是最终证明的。

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

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

在您提供的两种方法中,我认为制作file变量final并不重要。除非需要修改,否则一些代码约定主张创建所有变量final。有些人不赞成这一点。我认为它是precautionary principle的变体。