Java 绕过super()构造函数的策略/模式
又是我用我的旧Java应用程序。我有一个核心类,处理应用程序中的许多重要逻辑。我们叫它“我的经理”。MyManager继承自库中的类,我们称之为TopManager。限制条件是您不能修改这些定义中的任何一个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
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@greedybuddhasuper(String,String)
调用TopManager(String)
。我看不到TopManager
有默认构造函数。没有参数的构造函数实际上调用它(null)。没有关于主题(继承)的所有代码不正确CustomManager
需要在MyManager
中提供功能。但他不能更改TopManager和MyManager的代码,因为我理解op。它有一个东西,而不是一个。问题是您将无法调用MyManager.initialize(字符串)
因为它是一个私有方法。私有方法无论如何都不能被调用,即使您扩展了类。所以没有问题。@eternay操作试图不调用myManager.initialize(String)
:)这是一个开始。是的,它是initialize()部分,做了一些不好的事情,不应该在默认构造函数中。