(1)将公共操作和域放在超类中。
这个没什么好讲的,就是大家都共有的域和方法都放置在超类中,需要注意的是方法的权限修饰符一般都是public,而给该类本身使用的方法,权限修饰符一般是private。
(2)不要使用受保护的域。
域一般不修饰成protected,为什么?
①子类集合是无限的,任何人都可以派生出子类,并访问或修改实例域的值,这样就破坏了封装性;
②在同一个包中的任何类都可以访问protected域。
破坏封装性的事情是十分不理智的。
另外方法可以修饰成protected,而且很有用,为什么?因为修饰成protected可以指示:该方法不提供一般用途,应在子类中重新定义。在子类中覆盖后,可以把protected改成public。
(3)使用继承实现“is-a”关系。
这个很好理解,如果满足“A is a B”,那么可以设计成:A继承B。例如:卡车是车,所以可以设计卡车类继承车类。但是千万不要滥用了,明明飞船不是车,你还要设计成飞船类继承车类,那是有问题的。
(4)除非所有继承的方法都有意义,否则不要使用继承。
作者举了这么个例子:每个假日是一日,所以可以这样设计,Holiday类继承GregorianCalendar类。但是GregorianCalendar类中有一个共有方法add,这个方法会把假日的日期改成非假日的日期。那么在这里,这样的设计就显得不是很合理。
(5)在覆盖方法时,不要改变预期的行为。
假如我就是要这样设计,Holiday类继承GregorianCalendar类,那么我只能把共有方法add覆盖成合理的代码,或者什么都不做,或者抛出一个异常。但是add方法变味了,变的不像我当初设计的那样了。这里作者的意思是:不要这样,在覆盖父类中的方法时,不要偏离最初的设计想法。
(6)使用多态,而非类型信息。
如果出现这样形式的代码,应该考虑使用多态性:
if(x is of type 1)
action1(x);
else if(x is of type 2)
action2(x);
如果action1和action2表示的是相同的概念,就应该为这个概念定义一个方法,并将其放置在两个类的超类或借口中,然后就可以调用x.action(),以便使用多态性提供的动态分派机制执行相应的动作。
为什么要使用多态?因为利用多态性比使用对多种类型进行检测的代码更容易维护和扩展。
(7)不要过多的使用反射。
反射机制使我们可以在运行时查看域和方法。这种功能对编写系统程序来说极其使用,但是通常不适于编写应用程序。另外编译器很难帮助我们找出程序中的错误,只有在运行时才能发现错误并且导致异常。