0
点赞
收藏
分享

微信扫一扫

Effective Java第二版第4章

耳一文 2022-03-30 阅读 89

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常量域所引用的对象都是不可变的。

第14条 在公有类中使用访问方法而非公有域

举报

相关推荐

Effective Java第二版第2、3章

0 条评论