为什么在Java中LinkedList的poll()方法中需要final def

为什么在Java中LinkedList的poll()方法中需要final def,java,Java,您能否分享实施的见解?谢谢。LinkedList中的大多数方法都对局部变量使用final声明 这可能与背后的概念有关 将final添加到所有不应更改的内容中只会缩小您(或下一位程序员,正在处理您的代码)误解或误用生成代码的思维过程的可能性。至少当他们现在想要改变你以前不变的东西时,这应该会敲响一些警钟 从技术上讲,以6封信为代价,你可以保证你从未期望改变的东西永远不会改变 你提议的代码有效吗是。我看不出任何情况下不会发生这种情况。它在编程上是有效的 然而,在整个代码中使用final支持健全性测

您能否分享实施的见解?谢谢。

LinkedList中的大多数方法都对局部变量使用
final
声明

这可能与背后的概念有关

将final添加到所有不应更改的内容中只会缩小您(或下一位程序员,正在处理您的代码)误解或误用生成代码的思维过程的可能性。至少当他们现在想要改变你以前不变的东西时,这应该会敲响一些警钟

从技术上讲,以6封信为代价,你可以保证你从未期望改变的东西永远不会改变

你提议的代码有效吗是。我看不出任何情况下不会发生这种情况。它在编程上是有效的

然而,在整个代码中使用
final
支持健全性测试,并且可以理解,对于包含我们在Java中所做的几乎所有事情的所有
util
东西,最好知道一切都按预期工作


注意:如果有一个我还没有看到的安全问题,我想在另一个答案中了解它。

Compass的答案非常合理,但我只想补充一个猜测。我认为这是一个微观优化,因为对局部变量
f
的访问平均应该比对类字段
的访问要快。最后一个修饰符是良好的实践,但不会影响访问延迟。在这种特定情况下,收益可能非常小,因为您正在用两个类字段访问换取一个类字段访问和两个局部变量访问


这不是日常编程中应该做的事情,但由于集合库基本上被现有的每个Java程序使用,因此这些事情在这里是合理的。

Martin Buchholz在相关问题的列表中回答了这一点:

我们在JSR166土地上考虑到我们的软件足够重要 我们不推荐给普通java程序员的优化。临摹终稿 本地字段生成较小的字节码,可能有助于jit生成 更好的代码(对于当前的热点,仍然如此)

在局部变量上使用final没有性能优势,但它确实有一些优势 软件工程优势。我们倾向于用它来形容当地人和他们有同样的想法 名称作为字段,例如

final Foo Foo=this.Foo


罗盘,听起来很合理,很酷。看看引擎盖下的东西是怎么工作的总是很有趣的。
/**
 * Retrieves and removes the head (first element) of this list.
 *
 * @return the head of this list, or {@code null} if this list is empty
 * @since 1.5
 */
public E poll() {
    final Node<E> f = first; //why final here? <<-------- ******* --------
    return (f == null) ? null : unlinkFirst(f);
}
public E poll() {
    return (first == null) ? null : unlinkFirst(first);
}