类和接口是Java编程语言的核心,它们也是Java语言的基本抽象单元。
第15条:使类和成员的可访问性最小化
规则很简单:尽可能地使每个类或者成员不被外界访问。
对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来:
私有的(private) ------只有在声明该成员的顶层类内部才可以访问这个成员。
包级私有的(package-private) -----声明该成员的包内部的任何类都可以访问这个成员。从技术上讲,它被称为“缺省”(default)访问级别。
受保护的(protected) -----声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员。
公有的(public) -----在任何地方都可以访问该成员。
第16条:要在公有类而非公有域中使用访问方法
也就是应该适应包含私有域和公有访问方法(getter)的类代替。
第17条:使可变性最小化
为了使类成为不可变,要遵循下面五条规则:
- 不要提供任何会修改对象状态的方法。(也就是设值方法)。
- 保证类不会被扩展。
- 声明所有的域都是final的。
- 声明所有的域都为私有的。
- 确保对于任何可变组件的互斥访问。
第18条:复合优先于继承
第19条:要么设计继承并提供文档说明,要么禁止继承
第20条:接口优于抽象类
区别:接口完全是抽象的。它根本不存在方法的实现;而抽象类它可以有默认的方法实现
好处:
- 现有的类可以很容易被更新,以实现新的接口。
- 接口是定义mixin(混合类型)的理想选择。
- 接口允许构造非层次结构的类型框架。
例如:假设我们有一个接口代表一个singer(歌唱家),另一个接口代表一个songwriter(作曲家):public interface Singer { AudioClip sing(Song s); } public interface Songwriter { Song compose(int chartPosition); } // 现实生活中 有些歌唱家本身也是作曲家 public interface SingerSongwriter extend Singer, Songwriter { AudioClip strum(); void actSensitive(); }
- 接口使得安全地增加类的功能成为可能
- 对于骨架实现类而言,好的文档绝对是非常必要的。
第21条:为后代设计接口
第22条:接口只用于定义类型
有一种接口被称为常量接口,例如:
//物理常量
public interface PhysicalConstants {
static final double AVOGADROS_NUMBER = 6.022_140_587e23;
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
常量接口模式使对接口的不良使用。
应该使用不可实例化的工具类:
//物理常量
public class PhysicalConstants {
private PhysicalConstants(){}
public static final double AVOGADROS_NUMBER = 6.022_140_587e23;
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}