针对类和接口的一些约定
1使类和成员的可访问性最小化
1) 尽可能地使每个类或者成员不被外界访问到。
对于顶层的(非嵌套的)类和接口,只要两种可能的访问级别:包级私有和公有的。如果你用public修饰符声明了顶层类或者借口,那么他就是公有的,否则就是包级私有的。能包级私有就设置为包级私有的,如果是包级私有的,这个类就成了这个包的实现的一部分,而不是该包导出的API的一部分,那么在以后的发行版本中,可以对他进行修改、替换、或者删除,而无需担心影响现有的客户端程序。
2)实例域决不能是公有的,包含公有可变域的类并不是线程安全的
换句话说,对于每个域不能是public,而是private。然后提供一个访问的get方法。
除了公有静态final域的特殊情形外,公有类都不应该包含公有域,并有要确保公有静态final域所引用的对象都是不可变的。
2.在公有类中使用访问方法而非公有域
3. 使可变性最小化
为了使类成为不可变,要遵循下面五条规则
1) 不要提供任何会修改对象状态的方法
2)保证类不会被扩展
3)使所有的域都是final的
4)使所有的域都成为私有的
5)确保对于任何可变组件的互斥访问。如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。并且,永远不要用客户端提供的对象引用来初始化这样的域,也不要从任何方法中返回该对象引用。
构造器应该常见完全初始化的对象,并建立起所有的约束关系,不要在构造器或者静态工厂之外再提供公有的初始化方法,除非有令人信服的理由必须这么做。
4.复合优于继承
对于两个类A和B,只有当两者之间确实存在“is-a”关系的时候,类B才应该继承类A
5.接口优于抽象类
6. 接口只用于定义类型,不应该用来导出常量
有一种接口叫常量接口,这种接口没有包含任何方法,他只包含静态的final域,每个域导出一个常量.
常量接口是对接口的不良使用。
原因如下:
1. 接口被用作一个类型,通过此类型可以引用这个类的实例,为了其他目的定义接口不合适。
2.类中使用常量,这是实现细节,实现常量接口后,把这个实现细节泄漏到该类的API中,对类的用户也没有价值
3.将来中类不需要这些常量了,仍必须实现这个接口,以保证兼容性。
4.常量在编译时编译器会进行inline优化。接口变量会导致哪怕你更改了变量值也必须重新编译引用该接口的的类
5.一个非final类实现一个常量接口,它的所有子类的名字空间会被接口中的常量污染
可替代的方法:
不可实例化的工具类(final 类型,不能继承)