我正在编写所有在构造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?无论如何它们都被声明为私有变量。
谢谢!
答案 0 :(得分:1)
使用final
清楚地表明queue
和thread
在初始化后不应为读者和编译器分配不同的引用。
这可能不是它背后的全部原因,但是如果你知道的对象不应该被分配新的引用,那么你应该使用final
。
您似乎对private
的含义存在误解,请参阅有关modifiers in Java的帖子。
编辑(基于评论)
是的,如果未使用private
,可以通过反思更改SecurityManager
字段,请参阅this post;但是,我非常怀疑这就是为什么final
被包含在这里的原因。
如上所述,主要原因很可能是告知用户/读者代码,并确保在编码时,程序员不会意外更改这些对象的引用。
答案 1 :(得分:0)
通常将某些字段声明为final
的主要原因是使该类不可变(或不太可变)。这在多线程环境中有很大帮助,因为不可变对象易于操作,因为您不必担心任何并发问题。
但是,默认情况下,将字段声明为final
是一种很好的做法,除非您必须在某些时候修改它们。如果您决定在多个线程中使用该对象,这不仅会有所帮助,而且还会显示将来读取代码的人的意图。
Oracle教程解释了immutable objects背后的原因以及immutable objects are defined的原因。