java—hashset是一个编写良好的类吗?

zzwlnbp8  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(366)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**编辑这篇文章,更新这个问题,以便用事实和引文来回答。

15小时前关门了。
改进这个问题
我试图学习设计模式作为良好的编码实践,我想知道哈希集是否被认为是一个编写良好的类?如:
要构造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));
uurv41yg

uurv41yg1#

这是严格基于optinion的。
在很多情况下,程序员不得不做出艰难的选择。有这么多的团队在工作,很自然会出现以下一些问题。
然而,以下是我对这个主题的看法:
大部分jdk代码都是一团糟。不必要的代码,现代java jit编译器容易编写的复杂代码会做得更好
有很多微观优化,但最终很多实现都可以重写为更快、更干净、更兼容。
简单的类,比如 ArrayList 已经是一团糟了,如果您自己编写实现,速度会快一倍。
这个 Input/OuputStream 系统一团糟,应该在最顶层有一个接口。
有很多解决方案,比如 ThreadLocal 本质上是不安全的,如果不是更严重的问题,可能会导致泄漏。
有很多不应该重复的代码
对默认转换缺乏支持,尤其是 String 对于其他内容,应该有默认方法,如 s.toInt(int default) -喜欢的方法
这个 java.util. 功能及 FunctionalInterface s是一团乱,有很多不同的名字,可以用一种更加逻辑和直观的方式来构造,还有所有的收藏家和东西。可能会容易得多。
另一方面:
这个 Collections 结构(继承、接口等)总体上实现得很好,只缺少很少的特性
这个 java.nio 东西真的很好
异常(runtimeexception,throwable)层次结构非常好,为其他自定义类(人们可能更喜欢/应该使用)提供了稳定的基础
某些方面的目标不是类的实现,而是语言规范:
他们如何引入和整合Lambda和streams(整个功能性展示)
泛型和协方差/逆变换
反思与诠释
总而言之,如果您使用ProjectLombok之类的库(添加aop和其他东西)稍微提升您的默认java,那就太棒了。我真的很喜欢它,到目前为止,没有其他语言能不喜欢java(即使我不得不学习java时也讨厌java)
因此,正如其他人所说:
从代码中学习(有些技术非常好)
改进它们(有些明显不好)
最后谈谈你提到的几点:
这个 dummy 参数这是一种非常罕见的情况,即使如此,大多数情况下也只发生在生活质量方面:与其只有一个带3个参数的ctor,还不如有另一个带2个参数的ctor
关于编译时递归:java编译器可以与多程编译器相比较,因此“递归”不起作用。这个实现有点不好——一个非常理论化/学术化的抱怨——是 HashSetLinkedHashSet 现在在两个方向上都是静态绑定的。 LinkedHashSet -> HashSet 很好(否则继承将如何实现!?),但是 HashSet -> LinkedHashSet 他有点讨厌。但是,好吧,学术性的,因为这两门课在同一个包中,即使是新的模块系统也不会把它们分开。因此,除非您编写一个能够在如此低的级别上进行识别的打包工具(如我所做的),否则这一点没有实际影响。

相关问题