Java 强制子类提供初始化方法
提供一个抽象方法来帮助开发人员在超类构造函数中初始化复杂对象,这是一个好的实践吗 考虑以下类别:Java 强制子类提供初始化方法,java,oop,types,constructor,abstract,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(); } // Chil
// 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
对象需要几行代码
有更好的方法吗?谢谢大家! 这种方法的主要问题是,即使子类是实现
initPeople
方法所必需的,也没有什么强迫子类在构造函数中调用它
更好的方法是使用设计模式:
public abstract class A
{
protected Person[] people;
public final void execute()
{
initPeople();
performOperations();
}
protected abstract void initPeople();
protected abstract void performOperations();
}
是:只需删除该抽象方法,并让子类决定如何调用超类构造函数。如果在超类中添加抽象,子类必须重写它。顺便说一下,对于
initPeople
方法,您必须返回Person[]
。首先,您的代码不起作用,initPeople()
方法无效,但您返回的是无效@覆盖受保护人[]initPeople(){返回新人[]{新人(“詹姆斯”)、新人(“玛丽”)、新人(“伊丽莎白”)}@Raedwald除非我错过了什么,否则OP会明确地问“有更好的方法吗”表明问题不是从构造函数中调用抽象
方法,而是询问强制子类提供初始化方法的方法?在构造函数中调用抽象
方法是OP可以想到的解决方案之一,但这不是真正的问题,是吗?@Raedwald Wh至少,这与将此标记为副本有关系吗?一些不好的想法(我不同意这是一个不好的想法,但这是离题的)不会使它成为副本的候选对象,我确信?谢谢你的想法。我有一个问题:调用execute()安全吗
在A
的构造函数中,这是不推荐的。构造函数的目的是初始化对象,而不是调用对数据执行操作的方法。这里的想法是,在实例化A
的子类后,客户端将调用execute
方法。execute方法将初始化person数组首先通过initPeople
调用performOperations
。按照代码的结构,子类必须始终提供初始化person的方法,然后提供对其执行某些操作的方法。为什么要使用运行时异常
而不是不支持操作异常
kK根据定义,UnsupportedOperationException
表示不受支持的可选操作;但是,在这种特殊情况下,initPeople
是execute
方法正确性的核心。如果people
数组未初始化,则所有子类都无法正确执行其工作既然如此,为什么不把它抽象化呢?