Java 绕过super()构造函数的策略/模式

Java 绕过super()构造函数的策略/模式,java,constructor,design-patterns,superclass,Java,Constructor,Design Patterns,Superclass,又是我用我的旧Java应用程序。我有一个核心类,处理应用程序中的许多重要逻辑。我们叫它“我的经理”。MyManager继承自库中的类,我们称之为TopManager。限制条件是您不能修改这些定义中的任何一个 public class MyManager extends TopManager { public MyManager(String a, String b){ super(a); initialize(b); } public

又是我用我的旧Java应用程序。我有一个核心类,处理应用程序中的许多重要逻辑。我们叫它“我的经理”。MyManager继承自库中的类,我们称之为TopManager。限制条件是您不能修改这些定义中的任何一个

public class MyManager extends TopManager {

    public MyManager(String a, String b){ 
        super(a);
        initialize(b);
    }

    public MyManager(){
        this(null,null);
    }

    private void initialize(String b){
        //specific implementation
    }
}

public class TopManager {
    public TopManager(String s){ 
        //some implementation
    } 
}
我想创建一个CustomManager类,该类具有MyManager的所有功能,但使用TopManager默认构造函数

public class CustomManager extends MyManager
    public CustomManager(){

     //super(); NO should call TopManager constructor
    }

因为它在Java中不可能实现,所以我正在寻找其他聪明的想法

您的
CustomManager
应该继承自
TopManager
,而不是
MyManager

这是Java中不可能实现的原因。如果您设法绕过直接超类的调用构造函数,实际上会创建无效实例。
CustomManager
的实例也是
MyManager
。如果未调用
MyManager
的构造函数,则不会初始化它

这意味着,如果您不向
MyMaanger
报告您想这样做,就无法绕过它。“报告”是什么意思?这意味着
MyMaanger
应该知道您想要绕过它的正常初始化。您可以通过公开带有特殊布尔标志的构造函数来实现,该标志指示您是否需要正常初始化:

public class MyManager extends TopManager {
    public MyManager(boolean skipInit) {
        this(false);
    }
    protected MyManager(boolean skipInit) {
        super();
        if(skipInit) {
            return;
        }
        // init
    }
}

public class CustomManager extends MyManager {
     CustomManager() {
        super(true);
     } 
}

如果星星是对的,你也许可以使用合成而不是继承。扩展
TopManager
并实例化一个
MyManager
供内部使用。如果在同一个包中定义类,则可以访问包私有成员。这与扩展
MyManager
时的访问级别相同

我想创建一个拥有所有MyManager的CustomManager类 特征

是,使用合成

class CustomManager extends TopManager { // have all properties of TopManager

  private MyManager myManager; // have all behaviours of MyManager by delegating the call

}
但是使用
TopManager
默认构造函数

public class CustomManager extends MyManager
    public CustomManager(){

     //super(); NO should call TopManager constructor
    }
通过使用泛化

class CustomManager extends TopManager { // have all properties of TopManager

  private MyManager myManager; // have all behaviours of MyManager by delegating the call

}
我在寻找其他好主意

你考虑过使用类似的工具吗

这是一个相当粗略的想法,但我知道它可以在运行/加载时(通常用于模拟/动态aop实现)执行一些与代码生成/修改类相关的邪恶魔法


我知道我的建议相当粗糙,但似乎一旦你被你提到的遗留库逼得走投无路,它可能会很方便…

创建一个参数构造函数,但不要在其中做任何事情,它可以作为默认值constructor@greedybuddha
super(String,String)
调用
TopManager(String)
。我看不到
TopManager
有默认构造函数。没有参数的构造函数实际上调用它(null)。没有关于主题(继承)的所有代码不正确
CustomManager
需要在
MyManager
中提供功能。但他不能更改TopManager和MyManager的代码,因为我理解op。它有一个东西,而不是一个。问题是您将无法调用
MyManager.initialize(字符串)
因为它是一个私有方法。私有方法无论如何都不能被调用,即使您扩展了类。所以没有问题。@eternay操作试图不调用
myManager.initialize(String)
:)这是一个开始。是的,它是initialize()部分,做了一些不好的事情,不应该在默认构造函数中。