4 类和接口
第13条 使类和成员的可访问性最小化
当访问级别从default变成protected的时候,会大大增加可访问性。protected的成员是类导出的API的一部分,必须永远得到支持。导出的类的protected成员也代表了该类对于某个实现细节的公开承诺。受保护的成员应该尽量少用。
**实例域决不能是公有的。**如果域是非final的,或者是一个指向可变对象的final引用,那么一旦使这个域成为共有的,就放弃了对存储在这个域中的值进行限制的能力;这意味着,你也放弃了强制这个域不可变的能力。同时,当这个域被修改的时候,你失去了对它采取任何行动的能力。因此,包含共有可变域的类并不是线程安全的。 即使域是final的,并且引用不可变的对象,当把这个域变成公有的时候,也就放弃了“切换到一种新的内部数据表示法”的灵活性。
长度非零的数组总是可变的。所以,类具有public的static的final的数组域,或者返回这种域的访问方法,这几乎总是错误的。
// 这是有潜在的安全漏洞的。
public static final Ting[] values = {}
许多ide会产生返回指向私有数组的引用的访问方法,这回导致上述问题产生。此问题有两种解决办法:
(1)使数组私有,并增加一个公有的不可变列表。
private static final Ting[] PRIVATE_VALUES = {}
public static final List<Thing> VALUES = Collections.unmodifidableList(Arrays.asList(PRIVATE_VALUES ))
(2)使数组私有,并添加一个公有方法,它返回私有数组的一个备份。
private static final Ting[] PRIVATE_VALUES = {}
public static final Thing[] values() {
return PRIVATE_VALUES.clone()
}
除了public static final常量域的特殊情形外,共有类都不应该包含公有域。并且要确保public static final常量域所引用的对象都是不可变的。