本文是《Effective Java》1书的整理笔记
设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来。然后,模块之间只通过它们的API进行通讯,1个模块不需要知道其他模块的内部工作情况,这1概念被称为信息隐藏(information hiding)或封装(encapsulation)
它可以有效地消除组成系统各模块之间的耦合关系,使得这些模块可以独立的开发、测试、优化、使用、理解和修改。这样可以加快系统开发的速度,由于可以并行开发。
减轻保护的负担,由于程序员可以更快的理解这些模块,并在调试的时候可以不影响其他模块的负担。
虽然信息隐藏不会带来更好的性能,但可以有效的调理性能:通过剖析肯定了那些模块影响了性能。
提高了软件的可重用性
下降了构建大型系统的风险,由于即便全部系统不可用,但这些独立的模块却有多是可用的。
成员变量不能是公然的,常量是例外。
可使用
public static final
来修饰常量
另外常量要末包括基本类型,要末指向不可变对象的援用。虽然援用不能被修改,但援用的对象却是可以被修改的。
长度为非0的数组总是可变的,因此用public static final
修饰的数组容易带来潜伏的安全漏洞。
有两种解决方式,1是将数组变成私有,并添加1个公有的不可变列表
private static final Thing[] PRIVATE_VALUES = {};
public static final List<Thing> VALUES=
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
2是使数组变成私有的,并添加1个公有方法,返回数组的备份。
private static final Thing[] PRIVATE_VALUES = {};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
使用setter和getter方法访问类成员变量,有以下好处
* 可以添加束缚条件
* 可以灵活的修改该类的内部表示方式
不可变类的每一个实例包括的所有信息都必须在创建该实例的时候就提供,>并在对象的全部生命周期内固定不变。
final
的
如果类中有指向可变对象的变量,要确保不会被该类的客户端取得指向这些对象的援用。在构造器、访问方法和readObject
方法中使用保护性拷贝。
不可变对象本质上是线程安全的,它们不要求同步。
可以提供1个静态工厂将该类经常使用的实例缓存起来,基本包装类和
BigInteger
都有这样的静态工厂。
不要用为不可变对象提供clone
方法或拷贝构造器
不可变类的缺点是对不同的值都需要1个单独的对象。
可以提供1个配套的公有的可变配套类,避免在大范围操作时酿成的性能消耗,例如
String
和StringBuilder
声明构造器为private
可以避免该类被继承。
final
域,当它们第1次被要求计算时,把1些开消昂贵的结果缓存到这些域中,以便下次再次要求一样的计算,就直接返回这些缓存的值。Serializable
接口,就必须显示的提供1个readObject
或readResolve
方法,或使用ObjectOutputStream.writeUnshared
和ObjectInputStream.readUnshared
方法。《Java编程思想》称为组合,《Effective Java》称为复合
这里所说的缺点不包括,接口继承和完全为继承而设计的超类
可覆盖的方法是指非
final
的,public
或protected
的方法
也就是说必须精确的描写覆盖每一个方法所带来的影响。
对可覆盖的方法或非private
构造器,必须指明它调用了那些可覆盖的方法,是以甚么顺序调用的,每一个调用结果又是如何影响后续的处理进程。那些情况下它会调用可覆盖的方法
Cloneable
或Serializable
接口,不管clone
还是readObject
都不可以调用可覆盖的方法,不管是间接还是直接。Serializable
,并且该来有readResolve
或writeReplace
方法,就必须使其成为protected
,避免子类疏忽这两个方法。mixin是指这样的类型,类除实现它的“基本类型”以外,还可以实现这个mixin类型,以表明它提供了某些可供选择的行动。
接口之所以被称为mixin,是由于它允许任选的功能可被混合到类型的主要功能中。
AbstractCollection
类Adapter
,它允许外部类的实例被看做另外一个不相干的类的实例。例如Map
接口中的集合视图。static
。Comparator
实例。Runnable
、Thread
。欢迎大家访问我的博客,转载请注明出处
http://blog.csdn.net/abyss521