在链接列表中,实现final
用于很多地方。例如
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
为什么在上述实现中需要final
?创建一个新引用(l
),以便可以修改和覆盖last
。
答案 0 :(得分:3)
final
局部变量。它只是向未来的开发人员指出,该变量不会在方法中进一步修改。当然,在上面的方法中,我们不希望引用l
和newNode
的值在方法中的任何位置发生变化。如果你(或你的一个队友)不小心做了一次这样的改变,那么编译器就会给你错误。
此外,这也可能使编译器在它自己的部分做一些次优化,就像创建一个引用编译时常量final
的原始类型一样,将使编译器内联那些变量在方法中使用的任何地方。请注意,final
修饰符不使其成为字节码,因此运行时性能绝对不受影响。如上所述,只是出于展示开发者意图的目的,仅此而已。
答案 1 :(得分:1)
因为我们在变量'l'中的方法中存储了实例变量'last'的副本, 'l'将指向'last'指向的对象。我们需要确保在方法过程中我们不会松开指向该对象的指针。 因此它是最终的,它表示它只会指向“最后”所指的对象
答案 2 :(得分:0)
一旦设置了最终对象引用的标识,它仍然可以更改其状态,但不能更改其标识(也就是说,您无法将对象引用重新指向其他对象)。
在上面的代码片段中,我们不希望任何情况下引用l指向其他对象。因此我们有最终修饰符。这个引用非常重要,因为我们需要知道链接新元素的元素。我们不能冒失去这个参考的风险,因此它被标记为最终。