在Java8中,如果我们不再次为变量赋值,则变量实际上是final的。因此,这意味着如果我们声明一个方法并且没有将其参数声明为final,那么如果我们在方法定义中不对它们进行赋值,它们就是实际上的final。因此,在Java8中使参数final是否有任何区别?
我认为将参数标记为 final 的原因是为了表明您依赖它是 final 的。如果您在 lambda 表达式或内部类中使用该参数,则可能需要这样做。将参数标记为 final 可以告诉下一个程序员(或您一年后的自己)有依赖于该参数为 final 的代码。
final
作为文档的作用。为什么要记录任何东西?为什么不让下一个程序员从最简单的代码中弄清楚一切?如果你在一个遵循尽可能让其他程序员难以理解的指导方针的工作室里,那么如果可选的话,你就不应该在任何参数上加上final
。- 如果你知道一个参数需要是final
,即使只是有效地,为什么不明确地表达出来呢...为什么不让它变得完全清晰呢?- 如果有缺点,这将是完全不同的讨论。 - CryptoFool我使用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
不,除非你在匿名函数或lambda表达式中使用它,否则它并不是有效的final。在普通方法中不是这样,为什么应该是呢。