是否可以选择是否使用超类的构造函数?
不可能有条件地控制是否使用超类的构造函数,因为必须在构造自己的对象之前调用超类的构造函数之一。
综上所述,Java中有一个要求,构造函数的第一行必须调用超类的构造函数——实际上,即使没有显式调用超类的构造函数,也会有隐式调用至super()
:
public class X {
public X() {
// ...
}
public X(int i) {
// ...
}
}
public class Y extends X {
public Y() {
// Even if not written, there is actually a call to super() here.
// ...
}
}
应该强调的是,在执行其他操作后无法调用超类的构造函数:
public class Y extends X {
public Y() {
doSomething(); // Not allowed! A compiler error will occur.
super(); // This *must* be the first line in this constructor.
}
}
替代方案
也就是说,实现此处所需的一种方法可能是使用工厂方法模式,它可以根据某种条件选择实现类型:
public A getInstance() {
if (condition) {
return new B();
} else {
return new C();
}
}
在上面的代码中,取决于,该方法可以返回或condition
的实例(假设两者都是 class 的子类)。B
C
A
例子
以下是一个具体示例,使用的是 ainterface
而不是 a class
。
假设有以下接口和类:
interface ActionPerformable {
public void action();
}
class ActionPerformerA implements ActionPerformable {
public void action() {
// do something...
}
}
class ActionPerformerB implements ActionPerformable {
public void action() {
// do something else...
}
}
然后,将有一个类将根据通过方法传入的条件返回上述类之一:
class ActionPeformerFactory {
// Returns a class which implements the ActionPerformable interface.
public ActionPeformable getInstance(boolean condition) {
if (condition) {
return new ActionPerformerA();
} else {
return new ActionPerformerB();
}
}
}
然后,使用上述工厂方法的类根据条件返回适当的实现:
class Main {
public static void main(String[] args) {
// Factory implementation will return ActionPerformerA
ActionPerformable ap = ActionPerformerFactory.getInstance(true);
// Invokes the action() method of ActionPerformable obtained from Factory.
ap.action();
}
}