第13条:使类和成员的可访问性最小化:
实例域决不能是公有的。如果域是非final的,或者指向的是一个可变对象的final引用,那么一旦这个实例域变成公有,这个公有域就不是线程安全的了,很有可能出问题。
第14条:在公有类中使用访问方法而非公有域
第15条:使可变性最小化:
为了使类成为不可变,遵循下面5条原则:
* 不要提供任何会修改对象状态的方法 mutator
* 保证类不会被扩展,可将类声明为final,或者是将所有构造器变为私有或者包级私有,并添加静态工厂方法。
* 所有域都是final,并且是private的
* 确保对于任何可变组件的互斥访问
public final class Complex {
private final double re;
private final double im;
private Complex(double re, double im) {
this.re = re;
this.im = im;
}
public static Complex valueOf(double re, double im) {
return new Complex(re, im);
}
public static Complex valueOfPolar(double r, double theta) {
return new Complex(r * Math.cos(theta), r * Math.sin(theta));
}
}
第16条:复合优于继承:
只有当子类和超类确实存在is-a的关系的时候才用继承,其他一律用组合。
第17条:要么为继承而设计,并提供文档说明,要么就禁止继承:
为了允许继承,构造器绝对不能调用可被覆盖的方法。
第18条:接口优于抽象类:
第19条:接口只用于定义类型:
常量接口模式是对接口的不良使用。
如果要导出常量,有几种合理的方案:
* 如果这些常量与某个现有类或者接口紧密相关,就应该把这些常量添加到这个类或者接口中。
* 如果这些常量最好被看做枚举类型成员,就应该用枚举类型 enum type来导出这些常量。
* 如果是其他情况,则应该使用不可实例化的工具类utility class来导出这些常量。
public class PhysicalConstants {
private PhysicalConstants() {
} // Prevents instantiation
// Avogadro's number (1/mol)
public static final double AVOGADROS_NUMBER = 6.02214199e23;
// Boltzmann constant (J/K)
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
// Mass of the electron (kg)
public static final double ELECTRON_MASS = 9.10938188e-31;
}
简而言之:接口应该只是用来定义类型,它们不应该被用来导出常量。
第20条:类层次优于标签类:
第21条:用函数对象表示策略:
第22条:优先考虑静态成员类:
本人博客已搬家,新地址为:http://yidao620c.github.io/