Tag: effective java

如何制作对象的防御性副本?

如何制作包含不可变对象中可变字段的Mutable对象的防御性副本? class ImmutableObject { private final MutableObject immutable_field; ImmutableObject(MutableObject y) { this.immutable_field = y; } } class MutableObject { public int mutable_field; } MutableObject没有允许我设置字段的构造函数。 MutableObject的当前状态应该在Immutable Object中捕获并且永远不会改变。

Enum类型,如Joshua Bloch在Effective Java中所述

请看这个链接 。 关于Enums,布洛赫先生说 Java的枚举类型是通过公共静态最终字段为每个枚举常量导出一个实例的类。 我阅读了Enum类文档,但没有公共静态final字段 ,那么上述语句如何成立。 请解释。 谢谢

如何分配给局部变量在这里有帮助?

我正在阅读Effective Java双重检查锁定。 代码执行以下操作: private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // First check (no locking) synchronized(this) { result = field; if (result == null) // Second check (with locking) field = result = computeFieldValue(); } } return result; } 它表示使用result似乎不需要,但实际上确保该field仅在已经初始化的常见情况下只读取一次。 但我不明白这一点。 直接做if(field == null)有什么区别? 我不明白为什么if (result […]

Builder模式:首选哪种变体?

我正在阅读Effective Java书籍,并为我将来的参考创建笔记,我遇到了Builder Pattern。 嗯,我明白它是什么以及如何使用它。在这个过程中,我创建了构建器模式的两个示例变体。 我需要帮助列出每个人的差异和优势吗? 我当然注意到, Example 1暴露了较少的方法,通过较少限制和更通用,允许它更灵活地使用。 请指出我错过的其他事情? 例1 package item2; /** * @author Sudhakar Duraiswamy * */ public class Vehicle { private String type; private int wheels; interface Builder{ public T build(); } public static class CarBuilder implements Builder{ private String type; private int wheels; CarBuilder createVehicle(){ this.type= “Car”; return this; } CarBuilder […]

我们是否需要优先选择构造函数而不是静态工厂方法? 如果是的话,何时?

我一直在阅读Joshua Bloch撰写的 Effective Java ,到目前为止,它确实辜负了它的声誉。 第一个项目为构造函数的 静态工厂方法提供了令人信服的理由。 这么多,我开始质疑好老建设者的有效性:)。 本书的优点/缺点总结如下: 优点: 他们有名字! 我们有全面的实例控制(单身人士,表现等) 他们可以返回子类型/接口 编译器可以提供类型推断 缺点: 私有类不能被子类化 它们不像构造函数那样在文档中脱颖而出 第一个缺点实际上可能是A Good Thing (正如书中所提到的)。 第二个,我认为只是一个小缺点,可以通过即将发布的java版本轻松解决(javadoc的注释等) 看起来,最终工厂方法几乎具有构造函数的所有优点,许多优点,并没有真正的缺点! 所以,我的问题基本上分为三个部分: 默认情况下总是在构造函数上使用静态工厂方法是一种好习惯吗? 使用构造函数是否合理? 为什么面向对象的语言不能为工厂提供语言级支持? 注意:有两个类似的问题: 何时使用构造函数以及何时使用getInstance()方法(静态工厂方法)? 和对象的创建:构造函数或静态工厂方法 。 然而,答案要么只是提供上面的列表,要么重申我已经知道的静态工厂方法背后的基本原理。

使用工厂方法了解JDBC之类的服务提供者框架背后的概念

从Effective Java ( 第1项 : 考虑静态工厂方法而不是构造函数 ): 在编写包含该方法的类时,静态工厂方法返回的对象的类甚至不需要存在。 这种灵活的静态工厂方法构成了服务提供者框架的基础,例如Java数据库连接API(JDBC)。 服务提供者框架是多个服务提供者实现服务的系统,并且系统使实现可用于其客户端,从而将它们与实现分离。 我特别不明白为什么这本书说的是静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在? 有人可以用JDBC作为例子来解释。

说int枚举模式是编译时常量是什么意思?

这来自Effective Java 使用int枚举模式的程序很脆弱。 因为int枚举是编译时常量,所以它们被编译到使用它们的客户端中。 有人可以解释为什么int枚举模式被称为编译类型常量以及编译到客户端的含义是什么? 这是一个这样一个常数的例子: public static final int APPLE_FUJI = 0;

generics中的“递归类型绑定”是什么意思?

我正在阅读有效Java [第27项]中关于generics的章节。 书中有这一段: 允许(尽管相对罕见)类型参数受某个涉及该类型参数本身的表达式的限制。 这就是所谓的递归类型绑定。 和这个: // Using a recursive type bound to express mutual comparability public static <T extends Comparable> T max(List list) {…} 什么是递归类型绑定以及上面的代码如何帮助实现相互可比性?

为什么我们需要有界wilcard

我读过Joshua Bloch的精彩“有效Java”。 但书中的一个例子对我来说还不清楚。 它来自关于generics的章节,具体项目是“第28项:使用有界通配符来增加API灵活性” 。 在这个项目中,它展示了如何使用有界类型参数和有界通配符类型编写从集合中选择最大元素的算法的最通用和防弹(在类型系统的角度)版本。 编写的静态方法的最终签名如下所示: public static <T extends Comparable> T max(List list) 它与标准库中的Collections#max函数大致相同。 public static <T extends Object & Comparable> T max(Collection coll) 我理解为什么我们需要有限的通配符在T extends Comparable T extends Comparable类型约束,但在参数的类型中是否真的有必要? 在我看来如果我们只留下List或Collection ,不是吗? 我的意思是这样的: public static <T extends Comparable> T wrongMin(Collection xs) 我写了以下使用两个签名的愚蠢示例,并没有看到任何不同之处: public class Algorithms { public static class ColoredPoint extends Point { […]

Joshua Bloch在有效的java中建议如何在Java中使用缓存哈希码?

我有以下来自Joshua Bloch的有效java代码(第9章,第3章,第49页) 如果类是不可变的并且计算哈希代码的成本很高,您可以考虑在对象中缓存哈希代码,而不是在每次请求时重新计算它。 如果您认为此类型的大多数对象将用作哈希键,则应在创建实例时计算哈希码。 否则,您可能会在第一次调用hashCode时选择懒惰地初始化它(Item 71)。 目前尚不清楚我们的PhoneNumber课程是否值得这样做,只是为了向您展示它是如何完成的: // Lazily initialized, cached hashCode private volatile int hashCode; // (See Item 71) @Override public int hashCode() { int result = hashCode; if (result == 0) { result = 17; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * […]