Чтобы сделать конструктор вызовом первого оператора в конструкторе - PullRequest
0 голосов
/ 09 февраля 2011

Я новичок в 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 ]

5 голосов
/ 09 февраля 2011

Определите статический вспомогательный метод в вашем классе и вызовите его.например:

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

     private static ObjectType myHelper(String objectType) {
         ...
     }
3 голосов
/ 09 февраля 2011

В этом случае можно просто использовать условный оператор:

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

В более сложных сценариях можно использовать отдельный метод, как показано в ответе Оли.

0 голосов
/ 09 февраля 2011

вы можете сделать это статическим методом, подобным этому

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;
}
}
0 голосов
/ 09 февраля 2011

Похоже, вы заново изобретаете 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));
    }
}
0 голосов
/ 09 февраля 2011
public MyDerived(String objectType) {
    super( (objectType.equals("type1") ? A : B) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...