欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《effective java》之三:类和接口 博客分类: Java effectivejava 

程序员文章站 2024-02-15 08:55:22
...

第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/

相关标签: effective java