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

时间:2013-05-28 13:39:53

标签: java constructor design-patterns superclass

再次使用我的遗留Java App。我有一个核心类来处理App中的许多重要逻辑。我们称之为MyManager。 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
    } 
}

我想创建一个具有所有MyManager功能但使用TopManager默认构造函数的类CustomManager。

public class CustomManager extends MyManager
    public CustomManager(){

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

由于在Java中不可能,我正在寻找其他好主意

5 个答案:

答案 0 :(得分:2)

  

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

是的,使用撰写

  

但使用TopManager默认构造函数。

使用概括

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

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

}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

有一个原因,它在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);
     } 
}

答案 3 :(得分:1)

如果星星是正确的,你可以使用构图而不是继承。扩展TopManager并实例化MyManager以供内部使用。如果在同一个包中定义类,您将能够访问包私有成员。这与您在扩展MyManager时的访问权限相同。

答案 4 :(得分:1)

  

我正在寻找其他好主意

您是否考虑使用cglib之类的内容?

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

我知道我的建议相当骇人听闻,但似乎你曾经因为你提到的那个遗产库而走投无路......