链表实现中为什么要使用final关键字

3
在链表实现中,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

3
如果你养成将所有可以标记为最终版本的内容都标记为最终版本的习惯,那么每当你看到一个没有被标记为最终版本的内容时,就会知道它正在被赋值,并且不会意外地忽略它。因此这是一个好的做法。 - user541686
3个回答

4
final本地变量在这里并不是必需的。它只是向未来的开发人员表明,在方法中该变量不会再被修改。当然,在上述方法中,我们不希望引用lnewNode的值在任何时候都发生改变。有了final,如果您(或您的团队成员)意外做出这样的更改,编译器就会给您一个错误。

此外,这也可能使编译器自己做一些小型优化,例如将基本类型引用编译时常量的final内联到方法中使用这些变量的位置。请注意,final修饰符没有进入字节码,因此运行时性能完全不受影响。如上所述,它只是为了展示开发人员的意图,仅此而已。


澄清上述帖子:final与功能本身无关,因此永远不会出现您绝对需要使用final来实现某些情况的情况。对于字段而言,final基本上意味着“给定引用应该永远不会被重新分配”。 - Sanjay T. Sharma
1
@SanjayT.Sharma 当然,这就是我想要传达的。 - Rohit Jain
在你的原始帖子中提到“就功能而言,最终本地变量在这里并不是真正需要的”,这可能意味着在某些情况下,final会影响功能。我的评论更多是澄清,指出这种情况从来不存在。 - Sanjay T. Sharma
@SanjayT.Sharma 是的,我已经删除了那部分。我知道你只是在指那一行。那真的很误导人。 - Rohit Jain

1

由于我们在方法中将实例变量'last'的副本存储在变量'l'中,因此'l'将指向'last'指向的对象。我们需要确保在方法过程中不会丢失对该对象的指针。因此,使用final关键字表示它只会指向'last'所引用的对象。


0

一旦最终对象引用的身份被设置,它仍然可以改变其状态,但不能改变其身份(也就是说,您不能将对象引用重新指向其他对象)。

在上面的代码片段中,我们无论如何都不希望引用l指向其他对象。因此,我们使用了final修饰符。这个引用非常重要,因为我们需要知道要链接新元素的元素。我们不能冒险丢失这个引用,因此它被标记为final。


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