13,最小化类和成员的可访问性。这也没什么好说的,高内聚,低耦合,暴露出去的东西越少越好。类只有两种访问级别:public和package private。成员有四种访问级别, public, private, protected, package private。以前还没学Java的时候,就在《程序员》杂志上看过一个C++的文章说protected是鸡肋,成员应该要么private要么public,写多了代码发现还真是这么回事,protected这种东西,用处不大,还有个奇怪的不在同一个包里的子类不能直接使用的问题,真是应该尽量少用。
14,在公有类里面,使用访问器而不是公有的字段。字段是内部实现,不应该暴露出来。当然类如果不是public的,那暴露字段问题也不算太大。java类库里也有违反这个原则的类,比如AWT里面的Dimension和Point。
15,尽量减少类的可变性。不可变类有很多好处,他们的状态不会变化,是线程安全的,使用时不需要同步,坏处就是对于每个值,都会产生一个新的实例,比如在for循环里面使用+来连接String,会导致产生大量的String实例。这时候就需要提供辅助类,比如StringBuilder。
16,多用组合,少用继承。如果继承一个不是你自己写的类,对方的内部实现可能会把你坑死。《Head First Design Patterns》第一章讲策略模式的时候也是这么说的。
17,如果类要被继承,那就精心设计和写好文档,或者干脆就禁止继承。如果类要被继承,那要注意一些事情,比如构造函数里不能直接或间接调用可被子类覆盖的方法,如果实现了Cloneable和Serializable接口,那么clone和readObject方法里也不能直接或间接调用可被子类覆盖的方法。
18,接口优先于抽象类。单继承的体系里,继承了一个类就再也不能继承其他类,接口算是个解决方案吧,其实还是多继承最直观,但是多继承控制不了冲突,所以Java这套解决方案比C++那套还是强一点的。
19,接口只用来定义类型。不要用接口来定义常量。
20,使用类的继承体系而不是一个大而全的类。这是面向对象的基础了吧,没什么好说的。
21,使用函数对象来实现策略。Java不像FL那样能把函数当成一等公民,也没有函数指针,只能这样了。这个主要是用来实现策略模式的。
22,静态成员类比非静态的更好。嵌套类共有四种:静态成员类,非静态成员类,匿名类,本地类。后三种都叫做内部类。静态成员类通常用作辅助类。匿名类限制很多,只能在声明的地方被初始化,不能实现多个接口,也不能既继承一个类又实现一个接口。
14,在公有类里面,使用访问器而不是公有的字段。字段是内部实现,不应该暴露出来。当然类如果不是public的,那暴露字段问题也不算太大。java类库里也有违反这个原则的类,比如AWT里面的Dimension和Point。
15,尽量减少类的可变性。不可变类有很多好处,他们的状态不会变化,是线程安全的,使用时不需要同步,坏处就是对于每个值,都会产生一个新的实例,比如在for循环里面使用+来连接String,会导致产生大量的String实例。这时候就需要提供辅助类,比如StringBuilder。
16,多用组合,少用继承。如果继承一个不是你自己写的类,对方的内部实现可能会把你坑死。《Head First Design Patterns》第一章讲策略模式的时候也是这么说的。
17,如果类要被继承,那就精心设计和写好文档,或者干脆就禁止继承。如果类要被继承,那要注意一些事情,比如构造函数里不能直接或间接调用可被子类覆盖的方法,如果实现了Cloneable和Serializable接口,那么clone和readObject方法里也不能直接或间接调用可被子类覆盖的方法。
18,接口优先于抽象类。单继承的体系里,继承了一个类就再也不能继承其他类,接口算是个解决方案吧,其实还是多继承最直观,但是多继承控制不了冲突,所以Java这套解决方案比C++那套还是强一点的。
19,接口只用来定义类型。不要用接口来定义常量。
20,使用类的继承体系而不是一个大而全的类。这是面向对象的基础了吧,没什么好说的。
21,使用函数对象来实现策略。Java不像FL那样能把函数当成一等公民,也没有函数指针,只能这样了。这个主要是用来实现策略模式的。
22,静态成员类比非静态的更好。嵌套类共有四种:静态成员类,非静态成员类,匿名类,本地类。后三种都叫做内部类。静态成员类通常用作辅助类。匿名类限制很多,只能在声明的地方被初始化,不能实现多个接口,也不能既继承一个类又实现一个接口。