【问题标题】:Does a passed final variable in Java stay final on the other side?Java中传递的最终变量是否会在另一侧保持最终状态?
【发布时间】:2010-02-19 15:02:30
【问题描述】:

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

示例 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,作为全面规则和原则上的规则-以下两个答案都提到了这一点。因此,出于标准原因,我似乎对包含的一个简单的额外关键字进行了过多的阅读。谢谢大家!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我知道这是吹毛求疵...但我只想提一下“不可变”可能不是最好的词选择,因为所有字符串在 Java 中都是不可变的。不过,我确实明白你的意思
    • 我说过 reference 文件是不可变的。 IE。您不能将“文件”指向另一个“文件”对象。这正是 Java 中“final”关键字的含义。参考不能改变。不可变一词只是意味着无法更改的东西。它可以在许多情况下使用。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 在某些情况下,使用 final 肯定会给您带来更好的性能,例如使用 en.wikipedia.org/wiki/Memoization
    • @Stuart,你很困惑。记忆优化与 final 关键字无关(尽管它们可以在 Java 中结合使用,但 final 关键字不提供任何记忆模式固有的速度优势)。
    • OP 的问题从未得到解答。 Java 中的 p̶a̶s̶s̶e̶d̶ 返回的 final 变量是否在另一侧保持 final?
    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2012-10-11
    相关资源
    最近更新 更多