绕过构造函数调用构造函数中的第一个语句

时间:2011-02-09 10:47:34

标签: java inheritance constructor

我是一名Java新手,因此这是一个简单的问题:

我有一个类,其构造函数接受一个参数,如下所示:

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);
     }

这段代码的问题显然是构造函数调用必须是构造函数中的第一个语句。那么我该如何解决这个问题呢?我不想在ObjectType以外MyDerived作出决定。我还希望避免为CreateObject提供静态MyDerived方法。

5 个答案:

答案 0 :(得分:5)

在类中定义一个静态辅助方法,然后调用它。 e.g:

class MyDerived extends MyBase {
     public MyDerived(String objectType) {
           super(myHelper(objectType));
     }

     private static ObjectType myHelper(String objectType) {
         ...
     }

答案 1 :(得分:3)

在这种情况下可以使用条件运算符:

class MyDerived extends MyBase {
    public MyDerived(String objectType) {
        super(objectType.equals("type1") ? A : B);
    }
}

在更复杂的场景中,您可以使用单独的方法,如Oli的回答所示。

答案 2 :(得分:0)

public MyDerived(String objectType) {
    super( (objectType.equals("type1") ? A : B) );
}

答案 3 :(得分:0)

听起来你正在重塑Enums。

class Base {
    static enum Option {
        alpha, beta, gamma;
    }

    public Base(Option o) {
        // ...
    }
}

class Derived extends Base {
    public Derived(String s) {
        super(Option.valueOf(s));
    }
}

答案 4 :(得分:0)

你可以使用像这样的静态方法

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;
}
}