【发布时间】:2021-09-20 04:08:37
【问题描述】:
我正在尝试将设计模式作为良好的编码实践来学习,我想知道 HashSet 是否被认为是一个编写良好的类?例如:
要构造 LinkedHashSet,我们使用以下构造函数
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
谁叫这个:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
所以有一个无用的参数,这样做是否正确?
另外,我看到 LinkedHashSet 扩展了 HashSet
LinkedHashSet<E> extends HashSet
而HashSet在其代码中引用了LinkedHashSet,为什么那里没有编译时递归之类的东西?
// Create backing HashMap
map = (((HashSet<?>)this) instanceof LinkedHashSet ?
new LinkedHashMap<E,Object>(capacity, loadFactor) :
new HashMap<E,Object>(capacity, loadFactor));
【问题讨论】:
-
首先:“这是精心设计的”是非常基于意见的,因此不是关于 SO 的主题。第二:由于各种原因,JDK 类做了普通类通常不应该做的事情。对于这些类中的一个微优化实际上是有回报的,因为它们被大量使用,而且这些类将始终使用特定的 JVM 实现运行(因此优化可以考虑到这一点)。不要将 JDK 类的实现作为通用代码的灵感来源。
-
感谢@JoachimSauer 的评论,我曾经看过内部JVM代码来尝试向他们学习:P
-
我不是说“不要向他们学习”。只是不要假设您在其中看到的所有内容实际上都是非 JDK 代码的最佳实践。
-
这些集合的不同功能避免了代码重复,但像中国拼图一样粘在一起。带有虚拟参数的重载构造函数就是这样的工件。我会开始学习算法和专用数据结构,而不是代码“架构”。
标签: java design-patterns hashmap linkedhashmap