Effective Java 学习笔记(13)

来源:互联网 发布:网络人netman 编辑:程序博客网 时间:2024/05/21 00:00

影响模块设计好与坏的一个重要因素就是这个模块是否隐藏它的内部数据和其他一些实现细节。

信息隐藏的好处:方便独立开发,测试,优化,使用,理解和修改。能够提高系统开发速(因为各模块可以并行开发),也能易于维护和调试,也能减少系统构建的风险。

 

要设计良好的模块,规则很简单,就一句话:使每个类或接口尽量不可访问。

 

1.对于top-level的类和接口(与文件名相同的类或接口),只有两种访问权限:包可访问,公共访问。如果这个类可以设为包可访问,那它就应该是包可访问,这样在将来就可以修改,替换或删除这些类而不影响系统的向上兼容性。

2. 如果一个包可访问的类或接口只是被一个类使用,那么可以考虑把这个类作为nested类。

 

有时为了测试方面,有可能会提高类或接口的可访问,这种方法可行,但要注意最高只能提到包可访问性,而不能因为测试就把相关类暴露到API中。

 

字段永远不能为公共的,如果一个字段是non-final,或是其指向的对象是可改变的,将其设计为公共访问,就失去了对其值进行限制的能力。同样,也不能在其值被修改的时候做一些操作。因此,这些也不是线程安全的。

 

以上原则同样对静态函数适用,但对常量字段例外。

 

要注意一点,如果一个公共的final字段指向的是可改变的对象,那么就会有潜在的安全漏洞。

 

如下:

 public static final Thing[] VALUES= {...};

 

有两种解决方式:

一种是使用unmodifiableList,

private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

 

另一中是用clone

private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}