我正在阅读 LinkedBlockingQueue 代码 (JDK8u),我发现 LinkedBlockingQueue 的头部字段不是私有(private)的,但最后一个字段是私有(private)的。我找不到 head 的任何特定操作。那么为什么不将 head 设置为 private 呢?
/**
* Head of linked list.
* Invariant: head.item == null
*/
transient Node<E> head;
/**
* Tail of linked list.
* Invariant: last.next == null
*/
private transient Node<E> last;
最佳答案
首先是一些事实。
- 在 Java 6 中,
head
字段是private
。 - 到 Java 17,
head
字段是包私有(private)的……并且它有关于不变量的注释。 - 变化实际上发生在 Java 8 中。
那么为什么他们改变了它?
到目前为止我还没有弄清楚,但可能的原因可能包括:
- 这样子类(在同一个包中)就可以访问该字段,尽管我在已发布的代码库中看不到任何此类类。
- 为了更容易测试类(class)。 (这不是进行此更改的好理由,而且我看不到任何证据表明这是原因。)
- 这是与内部类相关的“个人风格”,虽然我不相信。 (为什么只为
head
做?为什么不为tail
也做?) - 这是偶然发生的。
在 Github 上花了 20 分钟查看历史记录后,我认为这可能是一个意外。根据“git blame”,更改似乎发生在此提交(https://github.com/openjdk/jdk8u/commit/6f31fa54ac050d781656d6e8ed18a40b55ef5c0d)中......但是当我查看提交中的内容时,我根本看不到更改,更不用说目的了1。这令人费解。
也许在Mercurial的历史上更清楚2。
无论如何,这整件事都是对好奇心的锻炼。他们更改它的原因并不重要,也不会影响他们所做的任何用户代码3。
1 - 变更集描述表明它只是与 java.util.concurrent
类的原始/主要作者维护的私有(private)存储库同步。
2 - 我们正在寻找最终 Mercurial 存储库的只读 Git 镜像。有可能在创建镜像的过程中搞砸了。
3 - ... 与用户代码中已存在的 Heisenbug 的模交互。
关于java - 为什么 LinkedBlockingQueue 的头部不是私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70443248/