在超类初始化期间引用子类逻辑和字段的最佳实践/替代方案

问题描述 投票:0回答:1

我有一个必须扩展且无法更改的父类。父类遵循从其构造函数调用非最终/可重写方法的有点不好的做法。必须在我的子类中重写这些方法之一,但在父构造函数调用期间必须绕过子类代码。

此外,实例在实例化后必须完全可用,即静态工厂方法不是一个选项。

编辑:我最初制作了重写方法

protected
,但实际上它是有效的
public
,因为有公共方法引用它。所以我编辑了这个例子以将其公开。结果是 Child 类必须重写该方法。如果没有覆盖,它将无法运行。

public class Parent {
    Parent() {
        parentMethod();
    }
    public void parentMethod() {
        //parent stuff
    }
}


public class Child extends Parent {
    Object someObject;
    Child () {
        someObject = //some setup
    }
    @Override
    public void parentMethod() {
        //someObject does not exist here when parent calls it
        someObject.doMyStuffInsteadOfParentStuff();
    }
}

据我所知,没有简单的方法可以避免这种情况。我无法更改父类,并且子类必须使用需要通过默认构造函数进行简单实例化的 API。

我能想到的最好的计划是在重写的方法中测试子类初始化。通过使用默认为 false 的布尔值,或检查对象引用是否为 null。这两者都依赖于 Java 的内部默认初始化逻辑,理论上,这可能会以令人困惑的方式改变和破坏我的代码(尽管我发现这种可能性极不可能)。 例如类似的东西

@Override protected void parentMethod() { //check null or check some primitive boolean if(someObject == null) super.parentMethod(); else someObject.doMyStuffInsteadOfParentStuff(); }

还有其他选择吗?如果不是,应该首选哪个选项(布尔检查与空检查)?

java constructor overriding instantiation
1个回答
0
投票
parentMethod()

我认为更好的方法是用委托代替继承。史密斯。像这样:

class Parent { Parent() { /** * Actually, this is a Bad Practice to call not * static method from the constructor */ parentMethod(); } protected void parentMethod() {} } class Child extends Parent { private final Parent delegate; private final Object someObject; public Child(Parent delegate) { this.delegate = delegate; someObject = new Object(); someObject.doMyStaffInseadOfParentSuff(); } }

© www.soinside.com 2019 - 2024. All rights reserved.