主頁

[Effective Java] Note: - Chapter-3-2: Be careful with clone() method

Cloneable接口的通用约定很弱,新建对象,然后逐域浅拷贝就能满足。所以Object的clone()方法实现的就是浅拷贝。但浅拷贝只对基本型和不可变对象有效。因为基本型没有引用,直接复制值。不可变对象只读不写也不受影响,而且来就是要控制实例,复制引用正合适。但可变对象如果是浅拷贝就不行。还需要另外重新调整,比如递归调用可变对象的clone()方法。这章第二个关键点,就是对Cloneable接口的继承问题。惯用法是,尽量让Object#clone()方法替我们工作。因此当一个类需要实现clone()方法,理想的情况就是它的所有超类的clone()方法都递归调用了super.clone()方法,最终成功追溯到Object#clone()方法。

阅读更多

[Effective Java] Note: - Chapter-3-1: How to code equals() and hashCode() method ?

equals()的五大通用约定 equanls()反映的是实例的逻辑相等(Logical Equality)。根据Java语言规范,“值相等”的等价性(equivalence relation)隐含五大通用约定: 自反性(reflexive):任何非null的值,x.equals(x)必须返回true。 对称性:任何非null的值,y.equals(x)为真,那么x.equals(y)也必须为真。 传递性:对任何非null的值,如果x.equals(y)为真,且y.equals(z)为真,那么x.equals(z)也必须为真。 一致性:对任何非null的值,多次调用x.equals(y)必须返回相同的结果。 非空性:所有null的值,x.equals(null)必...

阅读更多

[Effective Java] Note: - Chapter-2-2: Instance-Control

一个普遍原则是尽量避免生产不必要的对象,能用已有实例就用已有实例。有些情况甚至要将实例数量控制在一定范围之内。最极端的情况就是单例器Singleton,全局只存在唯一的实例。所以这一篇的主题是怎么控制构造器的访问权限,怎么重复利用有限数量的实例。

阅读更多

[Effective Java] Note: - Chapter-2-1: Create Instances with Factory Method or Builder Pattern

静态工厂方法可以为生产实例提供可观的灵活性,也可以进行实例控制。而且静态工厂方法还有利于简化公开接口,隐藏额外子类的好处。如果类的构造器或者静态工厂中具有多个参数,推荐使用Builder模式。它和静态工厂方法一样,也能为实例创建提供了很大的灵活性,以及保障了代码的可读性。而且它还比JavaBeans模式更安全。

阅读更多