Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制子类提供初始化方法_Java_Oop_Types_Constructor_Abstract - Fatal编程技术网

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
数组未初始化,则所有子类都无法正确执行其工作既然如此,为什么不把它抽象化呢?