Java8中的方法参数应该声明为final吗?

3
在Java8中,如果我们不再次为变量赋值,则变量实际上是final的。因此,这意味着如果我们声明一个方法并且没有将其参数声明为final,那么如果我们在方法定义中不对它们进行赋值,它们就是实际上的final。因此,在Java8中使参数final是否有任何区别?

5
如果您将它们声明为final,则无法重新分配它们。如果您不这样做,则可以重新分配它们。在我看来,将方法参数设置为final只会增加混乱。 - assylias
从语言设计的角度来看,这是一个有趣的问题。我们发现实例变量上的“final”与方法参数上的“final”有着不同的作用。语言设计者本可以自动使用按值传递的变量放置在可以逃逸其声明的块中。但是,这似乎会令人困惑,所以这种设计(大多数情况下)是有效的。“大多数情况下”是因为允许“有效地最终”参数会削弱原始意图:最终参数不再被语言使用;它现在只是一种语法提醒。 - Thomas Bitonti
3个回答

3

我认为将参数标记为 final 的原因是为了表明您依赖它是 final 的。如果您在 lambda 表达式或内部类中使用该参数,则可能需要这样做。将参数标记为 final 可以告诉下一个程序员(或您一年后的自己)有依赖于该参数为 final 的代码。


那还有什么意义呢?在你提供的两个例子中,改变代码并重新赋值参数都会导致编译错误,这明显表明你刚刚破坏了某些东西。 - assylias
1
我只是想指出final作为文档的作用。为什么要记录任何东西?为什么不让下一个程序员从最简单的代码中弄清楚一切?如果你在一个遵循尽可能让其他程序员难以理解的指导方针的工作室里,那么如果可选的话,你就不应该在任何参数上加上final。- 如果你知道一个参数需要是final,即使只是有效地,为什么不明确地表达出来呢...为什么不让它变得完全清晰呢?- 如果有缺点,这将是完全不同的讨论。 - CryptoFool
可以,但我更喜欢一个指南,它说你不应该重新分配参数。我喜欢这种方法:https://dev59.com/c3VC5IYBdhLWcg3w9GA9#138990(尽管最后一句话不适用于Java 8之后)。 - assylias

0

我使用final的方式和你一样。对我来说,它在局部变量和方法参数上看起来是多余的,并且它并没有传达有用的额外信息。

一个重要的事情是,我努力保持我的方法短小精悍,每个方法只做一件事。因此,我的局部变量和参数具有非常有限的作用域,并且仅用于单一目的。这最大程度地减少了意外重新分配它们的机会。

此外,正如您肯定知道的那样,final并不能保证您无法更改(非原始)变量的值/状态。只是一旦初始化就不能重新分配对该对象的引用。换句话说,它仅与原始或不可变类型的变量无缝工作。请考虑

final String s = "forever";
    final int i = 1;
    final Map<String, Integer> m = new HashMap<String, Integer>();

    s = "never"; // compilation error!
    i++; // compilation error!
    m.put(s, i); // fine

这意味着,在许多情况下,它仍然不能更轻松地理解代码内部发生的事情,误解可能实际上会导致难以检测的微妙错误。

0

不,除非你在匿名函数或lambda表达式中使用它,否则它并不是有效的final。在普通方法中不是这样,为什么应该是呢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接