10得票2回答
建造者模式验证 - 《Effective Java》

在《Effective Java(第2版)》的第2条中,作者提到了在使用构建器时对参数施加不变性的相关内容: “非常重要的一点是,在从构建器复制参数到对象之后,必须检查它们,并且必须在对象字段而不是构建器字段上进行检查(第39条)。如果违反了任何不变式,则构建方法应该抛出IllegalSta...

10得票1回答
未经检查的异常最好作为已检查的异常处理

我意识到在Java中,关于选用受检异常(checked exceptions)或者非受检异常(unchecked exceptions)已经有大量的讨论和探讨,我并不想再去重温整个争论的内容。 相反,我想提出一个非常具体的问题,这个问题在我阅读Joshua Bloch的《Effective ...

9得票1回答
在构造函数方法引用中,使用通用类型参数和不使用的区别是什么?

我正在阅读《Effective Java 3》并注意到第43条中的这段代码:“优先使用方法引用而不是Lambda表达式”: TreeMap<K,V>::new 注意类型参数。我之前一直只是这样写: TreeMap::new 我使用Intellij并没有收到任何关于此警告...

9得票3回答
Java模型对象设计

我一直在阅读《Effective Java》!书中最鼓舞人心的章节之一是不可变对象/构建器部分,在这里Bloch写了关于“构建器” - 类而不仅仅是POJO的内容。 注意:我在这里谈论的是模型对象:例如文章或汽车。 这是我以前编写这些对象的方式: public class Car { ...

9得票3回答
有时候在泛型方法的定义中会省略返回类型前面的尖括号,为什么会这样?

我正在阅读《Effective Java》第5章有关泛型的内容,特别是有关优先使用泛型方法的条款。我注意到有时在方法声明中省略了返回类型前的类型参数(在尖括号之间)。有许多类似的情况,但例如在第二版的第135页上: public void popAll(Collection<E>...

9得票3回答
乔舒亚·布洛赫所说的“extra-linguistic”是什么意思?

从这篇Artima关于clone和copy constructor的文章中可以了解到: 对象的clone方法非常棘手。它基于字段副本,并且它是“超语言级别的”。它在不调用构造函数的情况下创建一个对象。无法保证它能够保留构造函数所建立的不变式。多年来,由于如果只重复调用super.clone直...

9得票1回答
在规划继承时,构造函数是否允许调用可重写的方法?

来自《Effective Java第二版》,第17条: 对于每个public或protected方法或构造函数,文档必须指出该方法或构造函数调用哪些可重写的方法。 在同一条目的后面,它说: 构造函数不得直接或间接地调用可重写的方法。 这两个陈述不是矛盾的吗?还是我漏掉了什么?

8得票3回答
一个枚举类型是否可以为其每个常量都有一个构造函数?

请查看此链接。在他的书《Effective Java》中,Joshua Bloch说: 请注意,操作常量是从静态块放入stringToEnum映射中的,该静态块在常量创建后运行。 尝试让每个常量都从其自己的构造函数将自己放入映射中会导致编译错误。 这是一件好事,因为如果合法的话,它会...

8得票3回答
Eclipse中针对通用类型的自动补全

“按接口而非实现编程”是Effective Java中提到的一种良好的编程实践。例如,我更喜欢使用以下方式: List<String> al = new ArrayList<String>(); 结束 ArrayList<String> al = n...

8得票4回答
Java中如何实现哈希码缓存?这是Joshua Bloch在《Effective Java》一书中提出的建议。

我有以下来自Joshua Bloch的《Effective Java》(第3章,第49页)的代码片段: 如果一个类是不可变的,并且计算哈希码的成本很高,你可以考虑在对象中缓存哈希码,而不是每次请求时重新计算。如果你认为这种类型的大多数对象将被用作哈希键,则应当在实例创建时计算哈希码。否则,...