Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

应该使用java进行引用。util。这是最终结果吗?

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

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

有人能解释一下是否需要将队列、线程对象引用声明为最终引用吗?无论如何,它们都是声明的私有变量

谢谢


共 (2) 个答案

  1. # 1 楼答案

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

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

    Oracle教程解释了拥有immutable objects的原因以及如何使用immutable objects are defined

  2. # 2 楼答案

    放置final表明queuethread在初始化之后,不应为读取器和编译器分配不同的引用

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

    你似乎误解了private的意思,请看这篇关于modifiers in Java的帖子

    编辑(基于评论)
    是的,如果不使用SecurityManager,可以通过反射更改private字段,请参见this post;然而,我非常怀疑这是否是final被包括在这里的原因

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