8

我刚刚遇到了一些让我有些困惑的代码;我想澄清两个变化。

示例 1:

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

file声明“ ”的目的是final什么?由于 Java 原语是按值传递的,并且getAbsolutePath()只是返回 a 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,作为全面的规则和原则上的排序 - 以下两个答案都提到了这一点。因此,出于标准原因,我似乎对一个简单的额外关键字阅读过多。谢谢大家!

4

2 回答 2

14

final在这种情况下,仅意味着本地引用file将是不可变的。它在方法之外没有任何意义。一些编码约定提倡将所有变量设为最终变量,除非它们需要是可变的,因此当有人遵循此类准则时,您会看到类似的代码。

于 2010-02-19T15:04:49.617 回答
3

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

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

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

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

于 2010-02-19T15:14:24.810 回答