在引用JavaDocs for LongAdder的同时,它扩展了 Number 类。
然后,在查看源代码时,它是从 Striped64
这让我很困惑,为什么我们不能在javadocs中指定从Striped64类扩展的LongAdder ? 是因为 Striped64 扩展了 Number 吗?
答案 0 :(得分:5)
LongAdder扩展哪个类?
如源代码中所示,它扩展了Striped64
。由于该类不是公共API,因此Javadoc不会告诉您。
默认情况下,Javadoc仅为public
和protected
成员生成文档;换句话说,仅记录了公共API 1 。 Striped64
类是程序包专用的,因此未记录。由于未记录该类,因此找到了下一个最近记录的祖先,在这种情况下恰好是Number
。请注意,您可能有一个记录的类Foo
,它有15个以上的祖先,但是如果这些祖先都不是公共API,则Javadoc将显示Foo extends Object
。
从公共API与私有API的角度来看,LongAdder
扩展了Striped64
是无关紧要的。后一类是实施细节(即私有API)。定义库合同的是公共API。因此,在这种情况下,用户只关心LongAdder
是Number
的子类。
如果需要,可以配置Javadoc以记录所有内容,包括package-private和private
成员。但是,生成的文档可能只能供私人使用(例如,在维护该库的组织内部)。
1。使API公开或私有的原因并不仅仅基于可见性修饰符。该类所在的包也很重要。例如,JDK在软件包中有许多类,它们的前缀为com.sun
,oracle
,jdk.internal
等。这些软件包中的类是私有API,因此未在公开的Javadoc中进行记录。
随着模块的出现,“私有软件包”的想法在Java 9中获得了更多的官方地位。现在,您可以显式声明模块导出了哪些包,并且由运行时强制执行。
答案 1 :(得分:0)
他们可能正在扩展 Number
LongAdder
中的课程,谁知道?
来自Oracle Docs:
可以得出结论, LongAdder
通过扩展 AtomicLong
来使用 Striped64
。
问:为什么LongAdder扩展了Striped64?
A:
Striped64
保留单元格的哈希表(其中每个单元格是AtomicLong
)。当使用多个线程将值添加到LongAdder
(扩展了Striped64
),然后线程将其值相加 到该哈希表中的不同单元格。这导致并发线程 处理并增加了吞吐量。
可能是Striped64是内部实现,他们希望将其抽象化。