2010-02-19 42 views
6

我刚刚遇到一些令我感到困惑的代码;我想澄清两种变化。Java中传递的最终变量是否保留在另一端?

例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变量,使用返回它的public get函数 - 但通过调用函数接收它的变量必须指定访问修饰符。因此,如果它指定了public,那么返回的变量将在该范围内为public。如果它指定private,则返回的变量将在该范围内为private。与final有什么不同?是一个可以传递的变量的“恒定性”吗?考虑到我对Java的了解,这让我觉得不太可能。

或者我完全错过了这一点,在上面的代码中有final关键字的其他目的?

编辑:

我签回来谁写的代码,原来的开发商,他说他只是把final关键字,因为他原本以为的方法将是一个很长时间,并希望确保该文件始终保持不变。他还表示,他通常会声明一些不应该被改为final的变量,作为一个普遍的原则,并且遵循原则 - 这两点都提到了下面的答案。所以看起来我读了太多关于标准原因的简单的额外关键字。感谢大家!

回答

3

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

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

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

在你给出的两种方法中,我发现在使file变量final没有价值。除非需要修改,否则一些代码约定主张使所有变量均为final。有些人不赞同这一点。我认为它是precautionary principle的变体。

+0

有些情况下,使用最终肯定会给你更好的表现,例如使用http://en.wikipedia.org/wiki/Memoization。 – Stuart 2010-02-19 15:21:53

+0

@Stuart,你很困惑。 Memoization优化与'final'关键字无关(尽管它们可以在Java中结合使用,'final'关键字不提供任何Memoization模式的固有速度优势)。 – BrainSlugs83 2014-10-05 05:11:01

+0

OP的问题从未得到解答。一个p̶a̶s̶s̶e̶d̶返回Java最终变量保持最终的另一端? – 2017-05-19 21:20:56

13

final在这种情况下仅仅意味着本地参考file将是不可变的。在方法之外没有意义。有些编码惯例主张所有变量都是最终的,除非它们需要可变,所以当有人遵循这些准则时,你会看到类似的代码。

+3

我知道这是挑剔的......但我只是想提到“不可变的”可能不是最好的单词选择,因为所有的字符串在Java中都是不可变的。不过,我明白你的观点,不管 – froadie 2010-02-19 15:15:41

+5

我说_reference_文件是不可变的。即你不能将'文件'指向另一个'文件'对象。这正是'final'关键字在Java中的含义。该参考不能更改。单词不可变只是意味着不能改变的东西。它可以在很多情况下使用。 – Kris 2010-02-19 15:40:19