Java 让构造函数调用构造函数中的第一条语句
我是Java新手,因此有一个简单的问题: 我有一个类,其构造函数接受一个参数,如下所示:Java 让构造函数调用构造函数中的第一条语句,java,inheritance,constructor,Java,Inheritance,Constructor,我是Java新手,因此有一个简单的问题: 我有一个类,其构造函数接受一个参数,如下所示: class MyBase { public MyBase(ObjectType1 o1) {} ... } class MyDerived extends MyBase { public MyDerived(String objectType) { ObjectType o = null; if (objectType.equals("ty
class MyBase {
public MyBase(ObjectType1 o1) {}
...
}
class MyDerived extends MyBase {
public MyDerived(String objectType) {
ObjectType o = null;
if (objectType.equals("type1")
o = A; /* some value */
else
o = B; /* some other value */
super(o);
}
我想从这个类派生一个类,它的构造函数接受一个字符串并调用基类的构造函数,根据这个参数选择合适的参数,如下所示:
class MyBase {
public MyBase(ObjectType1 o1) {}
...
}
class MyDerived extends MyBase {
public MyDerived(String objectType) {
ObjectType o = null;
if (objectType.equals("type1")
o = A; /* some value */
else
o = B; /* some other value */
super(o);
}
这段代码的问题显然是构造函数调用必须是构造函数中的第一条语句。那么我该如何解决这个问题呢?我不想在
MyDerived
之外做出关于ObjectType
的决定。我还希望避免为MyDerived
提供一个静态CreateObject
方法,在类中定义一个静态助手方法,并调用它。e、 g:
class MyDerived extends MyBase {
public MyDerived(String objectType) {
super(myHelper(objectType));
}
private static ObjectType myHelper(String objectType) {
...
}
在这种情况下,可以只使用条件运算符:
class MyDerived extends MyBase {
public MyDerived(String objectType) {
super(objectType.equals("type1") ? A : B);
}
}
在更复杂的场景中,您可以使用单独的方法,如Oli的回答所示。这听起来像是在重新设计枚举
public MyDerived(String objectType) {
super( (objectType.equals("type1") ? A : B) );
}
class Base {
static enum Option {
alpha, beta, gamma;
}
public Base(Option o) {
// ...
}
}
class Derived extends Base {
public Derived(String s) {
super(Option.valueOf(s));
}
}
您可以使用这样的静态方法来完成
public class Main {
public static void main (String[] args) {
new MyDerived("one");
new MyDerived("two");
}
}
class MyBase {
public MyBase(Object o) {
System.out.println(o.toString());
}
}
class MyDerived extends MyBase {
public MyDerived(String objectType) {
super(getType(objectType));
}
private static Object getType(String type) {
Integer integer = null;
if (type.equals("one") ) {
integer = 1; /* some value */
} else {
integer = 2; /* some other value */
}
return integer;
}
}
静态方法有什么问题?这是解决这个问题的一个干净的办法。