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

时间:2013-12-10 17:53:13

标签: java

我正在编写所有在构造Timer类对象时调用的代码。我可以看到以下

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);

有人可以解释一下我是否需要声明队列,线程对象引用为final?无论如何它们都被声明为私有变量。

谢谢!

2 个答案:

答案 0 :(得分:1)

使用final清楚地表明queuethread在初始化后不应为读者和编译器分配不同的引用。

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

您似乎对private的含义存在误解,请参阅有关modifiers in Java的帖子。

编辑(基于评论)
是的,如果未使用private,可以通过反思更改SecurityManager字段,请参阅this post;但是,我非常怀疑这就是为什么final被包含在这里的原因。

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

答案 1 :(得分:0)

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

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

Oracle教程解释了immutable objects背后的原因以及immutable objects are defined的原因。