强制子类提供初始化方法

时间:2017-10-20 06:07:51

标签: java oop types constructor abstract

提供一个抽象方法来帮助开发人员初始化超类构造函数中的复杂对象是一个好习惯吗?

考虑以下课程:

// Parent class
abstract public class A() {
    protected Person[] people;

    public A(Person[] people) {
        this.people = people;
    }

    abstract protected Person[] initPeople();
}

// Child class
public class B extends A {
    public B() {
        super(initPeople());
    }

    @Override
    protected Person[] initPeople() {
        return new Person[] {
            new Person("James"),
            new Person("Mary"),
            new Person("Elizabeth")
        };
    }
}

如果没有initPeople方法,子类的开发人员可能会自己添加它,因为创建people对象需要多行。

有更好的方法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

这种方法的主要问题是即使子类需要实现initPeople方法,也没有任何东西迫使子类在构造函数中调用它。

更好的方法是使用Template设计模式:

public abstract class A 
{
    protected Person[] people;

    public final void execute() 
    {
         initPeople();
         performOperations();
    } 
    protected abstract void initPeople();
    protected abstract void performOperations();
}