关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**编辑这篇文章,更新这个问题,以便用事实和引文来回答。
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));
1条答案
按热度按时间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编译器可以与多程编译器相比较,因此“递归”不起作用。这个实现有点不好——一个非常理论化/学术化的抱怨——是
HashSet
及LinkedHashSet
现在在两个方向上都是静态绑定的。LinkedHashSet -> HashSet
很好(否则继承将如何实现!?),但是HashSet -> LinkedHashSet
他有点讨厌。但是,好吧,学术性的,因为这两门课在同一个包中,即使是新的模块系统也不会把它们分开。因此,除非您编写一个能够在如此低的级别上进行识别的打包工具(如我所做的),否则这一点没有实际影响。