gpt4 book ai didi

java - 为什么 LinkedBlockingQueue 的头部不是私有(private)的?

转载 作者:行者123 更新时间:2023-12-05 01:54:56 25 4
gpt4 key购买 nike

我正在阅读 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;

最佳答案

首先是一些事实。

  1. 在 Java 6 中,head 字段是private
  2. 到 Java 17,head 字段是包私有(private)的……并且它有关于不变量的注释。
  3. 变化实际上发生在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com