15. 使类和成员的可访问性最小化
一个好用的类的属性必须要隐藏起来,干净的将它与类的api分离开来,类之间只通过api相互使用,降低他们之间的耦合性。为了做到这一点,建议根据情况选择尽可能低的访问级别修饰符。
public 修饰不可变属性时(final修饰的属性)只是暴露的读权限,危害不是很大。但要注意的是,对于成员属性是对象的情况,不能在用final修饰后就认为危害很小了而用public修饰它,final修饰表示引用指向的对象不可变了,但根据引用取修改对象的内容是可以的。
16. 在公共类中使用访问方法而不是公共属性
大量使用的getter、setter方法就是符合这条原则,这样不仅将属性的读、写分开了,还可以在访问属性前做一些事、访问完属性后做一些事,要灵活的多。而不像公共属性,读写权限完全同时暴露,一旦被访问就是无条件被使用。
17. 最小化可变性
我们都知道String类一旦实例化后那这个对象的值是不可变的,是一个典型的最小化可变性的例子。除它之外,还有一众包装类:Integer、Double、Float.....都是将不可变性最小化的例子。他们都有如下特性:
(1)所有属性都是final修饰的不可变属性。如String类的 char[] 数组,用final修饰后就不能修改引用指向的数组
(2)所有属性都用private修饰。如String类的char [] 数组,这样就不能通过引用访问数组修改每个元素的内容
(3)类没有提供修改这些属性的方法。如String类的char[] 数组,用private修饰也没有对其的setter方法,保证了字符内容的不可变。
(4)在以上基础上,为了防止有子类恶意的继承并修改类的可变性,需要用final修饰类,设置为不可继承。
最小化类的可变性好处是:对象从创建后它的状态就永远不可能被改变,是天然线程安全的,可以被任意的共享。也有一些坏处:对于每一个值都需要创建一个新对象,不可以从旧对象的基础上修改而来。一般的,尽量将一个类的可变性最小化。