java.util.Timer中的引用应该是最终的吗?

java.util.Timer中的引用应该是最终的吗?,java,Java,我正在浏览代码,所有这些代码都是在构造计时器类对象时被调用的。我可以看到以下几点 public class Timer { /** * The timer task queue. This data structure is shared with the timer * thread. The timer produces tasks, via its various schedule calls, * and the timer thread consumes, executing

我正在浏览代码,所有这些代码都是在构造计时器类对象时被调用的。我可以看到以下几点

public class Timer {
/**
 * The timer task queue.  This data structure is shared with the timer
 * thread.  The timer produces tasks, via its various schedule calls,
 * and the timer thread consumes, executing timer tasks as appropriate,
 * and removing them from the queue when they're obsolete.
 */
private **final** TaskQueue **queue** = new TaskQueue();

/**
 * The timer thread.
 */
private **final** TimerThread **thread** = new TimerThread(queue);
有人能给我解释一下将队列、线程对象引用声明为最终引用的必要性吗?它们无论如何都是声明的私有变量


谢谢

put
final
明确指出,
queue
thread
在初始化后,不应为读取器和编译器分配不同的引用

这可能不是它背后的全部原因,但是如果您知道不应该为对象分配新的引用,那么您应该使用
final

你似乎对什么是
private
有误解,请看这篇文章

编辑(基于评论)
是的,如果未使用
SecurityManager
,则可以通过反射更改
private
字段,请参阅;然而,我非常怀疑这是否是此处包含
final
的原因


如上所述,主要原因很可能是告知用户/读者代码,并确保在编码时,程序员并没有意外地更改这些对象的引用。

final
放在一起,清楚地表明
队列
线程
在初始化后,不应为读取器和编译器分配不同的引用

这可能不是它背后的全部原因,但是如果您知道不应该为对象分配新的引用,那么您应该使用
final

你似乎对什么是
private
有误解,请看这篇文章

编辑(基于评论)
是的,如果未使用
SecurityManager
,则可以通过反射更改
private
字段,请参阅;然而,我非常怀疑这是否是此处包含
final
的原因


如上所述,主要原因很可能是通知用户/读者代码,并确保在编码时程序员不会意外更改这些对象的引用。

通常将某些字段声明为
final
的主要原因是使类不可变(或不太可变)。这在多线程环境中非常有用,因为不可变对象很容易操作,因为您不必担心任何并发问题

但是,最好在默认情况下将字段声明为
final
,除非您必须在某个时候修改它们。这不仅在您决定在多个线程中使用该对象时会有所帮助,而且还会为将来阅读代码的人显示意图


Oracle教程解释了拥有和如何拥有的原因。

通常,将某些字段声明为
final
的主要原因是使类不可变(或不太可变)。这在多线程环境中非常有用,因为不可变对象很容易操作,因为您不必担心任何并发问题

但是,最好在默认情况下将字段声明为
final
,除非您必须在某个时候修改它们。这不仅在您决定在多个线程中使用该对象时会有所帮助,而且还会为将来阅读代码的人显示意图


Oracle教程解释了拥有和如何拥有的原因。

是否有理由让它们可变?是否有理由阻止
序列化
?是否有理由让它们可变?是否有理由阻止
序列化
?是否有方法或任何方式(给定当前代码)我们可以让队列和线程引用指向不同的对象吗?不提供setter方法并使这些引用私有化的全部目的是确保这些引用不会被更改。@gagansab不,您对
private
有一点误解<代码>最终版用于使引用不发生更改。请参见编辑…@gagansab,或者您是在问它是否为最终版本,我们可以更改它吗?感谢您提供指向类修饰符的链接,我确实理解什么是私有版本,什么是最终版本,但我对这个问题的意图是您在第二次评论中正确指出的,如果您不将其设置为最终版本,我们有办法更改它吗(给定计时器的当前代码)?是否有方法或任何方式(给定当前代码)我们可以使队列和线程引用指向不同的对象吗?不提供setter方法并使这些引用私有化的全部目的是确保这些引用不会被更改。@gagansab不,您对
private
final
有一点误解,这是用来进行引用的rences不会改变。请参见编辑…@gagansab,或者你是在问它是否是最终的,我们可以改变它吗?谢谢你链接到类修饰符,我确实理解什么是私有的,什么是最终的,但我对这个问题的意图是你在第二次评论中正确指出的,如果你不让它成为最终的,有什么方法可以改变吗nge it(给定计时器的当前代码)?