谨慎设计类,父类和子类的继承

abstract class Person {
private final String name;
private final int age;
protected Person(String name,int age) {
this.name=name;
this.age=age;
}
protected String getName() {
return name;
}
protected int getAge() {
return age;
}

}

以上是父类

class Employee extends Person{
private Employee(String name, int age) {
super(name, age);
}
public static Employee newInstance(String name,int age) {
return new Employee(name, age);
}
public String getName() {
return super.getName();
}
public int getAge() {
return super.getAge();
}

}

以上是子类

在设计类,类与类之间的关系,尤其是父类与子类之间的关系的时候,往往会出现这样一种情形:父类属性不可变,

比如上式 一个Person被创建之后 理论上他的名字,年龄就会被确定 ,如果你想修改他 ,你只能去删除当前对象,并重新创建一个新的对象,这是基于现实中的常见例子。 而且你需要保证他的可访问性需要备注控制到最小,以降低耦合度,本例将class Person  的可访问性设置为default 即包级私有 只对该包下的某些类开放 最后设置属性为private final 表示该属性是私有的 且是不变的,再将其类设置成abstract 用来表示该类不是我们想要的类型,我们想要的类型是Employee 所以将其设置成abstract,让其成为一个专门设计的继承类,接着设计Employee 类 他显然是一个Person, 严格意义上的Is -a ;所以我们考虑继承 (role:如果非常确定两类之间存在Is -a 的关系 才使用继承,并且将可访问性降到最低)我们采取静态工厂的方式去创建Employee的一个实例 ,关于静态工厂的好处不在多说,Effective java推荐在任何能使用构造器的地方都应当使用静态工厂方法 ,如果在Employee类里面想要访问他的两个属性,我们会发现根本访问不了 !因为你将Person的属性设置成了Private,但是我们有需要访问Employee的属性的需求 于是在Person类里面设置了getter方法,然后在Employee里面去重载他 ! 设计类真的很麻烦,但是稍微懂得一点就会发现之前写的代码是多么的糟糕!

猜你喜欢

转载自blog.csdn.net/WK_SDU/article/details/79848462