java学习之路--继承的设计技巧

1.将公共操作和域放在超类
2.不要使用受保护的域
第一,子类集合是无限制的,任何一个人都能够由某个类派生一个子类,并写代码以直接访问prorected的实例域,从而破坏了封装性。
第二,在Java程序设计语言中,在同一个包中的所有类都可以访问protected域,而不管它是否为这个类的子类。
3.使用继承实现“is-a”关系
4.除非所有继承的方法都有意义,否则不要使用继承
假设想编写一个Holday类,毫无疑问,每个假日也是一日,并且一日可以用Gregorian Calendar类的实例表示,因此可以使用继承

class Holiday extends GregorianCalendar{.....}

很遗憾,在继承的操作中,假日集不是封闭的。在GregorianCalendar中有一个公有方法add,可以将假日转换成非假日:

Holiday christmas;
christmas.add(Calendar.DAY_OF_MONTH,12);

因此,继承对于这个例子来说并不太适宜。需要指出,如果扩展成LocalDate就不会出现这个问题。由于这个类是不可变的,所以没办法吧假日转换成非假日。
5.在覆盖方法时,不要改变预期的行为
例如,可以重定义Holiday类中的add方法“修正”原方法的问题,或者什么也不做,或抛出一个异常,或继续到下一个假日。
然而这些都违反了置换原则。语句序列

int d1=x.get(Calendar.DAY_OF_MONTH);
x.add(Calendar.DAY_OF_MONTH,1);
int d2=x.get(Calendar.Day_OF_MONTH);
System.out.println(d2-d1);

不管x属于GregorianCalendar类,还是属于Holiday类,执行上述语句都应该等得到预期的行为。
6.使用多态,而非类型信息
无论什么时候,对于下面的这种形式的代码

if(x is of type1)
action1(x);
else is(x is of type2)
action2(x);

都应该考虑使用多态性。
action1与action2表示的是相同的概念吗?如果是,就应该为这个概念定义一个方法,并将其放置在两个类的超类或者接口中,然后就可以调用

x.action();

以便使用多态性提供的动态分派机制执行相应的动作。使用多态方法或者接口编写的代码比使用对多类型进行检测的代码更容易维护和扩展。
7.不要过多地使用反射
反射机制使得人们可以通过在运行时查看域和方法,让人们编写出更具有通用性的程序,但是通常不适用写应用程序。反射是很脆弱的,即编译器很难帮助人们发现程序中的错误,因此只有在运行时才发现错误并导致异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值