переключить рефактор создания объекта - PullRequest
0 голосов
/ 18 сентября 2018

Предположим, у меня есть классы A, B, каждый из которых расширяет некоторый класс X. И я хочу, чтобы метод создавал A или B на основе некоторого значения параметра (значение является результатом некоторой другой логики).

Могу ли я сделать это без оператора switch?

т.е.:

class X {...}
class A extends X {...}
class B extends X {...}

Так наивно было бы сделать класс:

class Z {
    X createObject(int type) {
        switch(type)
            case 1: return new A();
            ...
            case 2: return new B();
}

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Конечно, вы можете сделать это без switch заявления.

Если у вас есть только несколько случаев, вы можете использовать троичный оператор.

  public static X createObject(int type) {
    return type == 1 ?
      new A() :
      type == 2 ?
        new B() :
        null;
  }

Вы также можете использовать более общий подход:

  private static final Map<Integer, Supplier<X>> FACTORIES;
  static {
    FACTORIES = new HashMap<>();
    FACTORIES.put(1, A::new);
    FACTORIES.put(2, B::new);
  }

  public static X createObject(int type) {
    return Optional.ofNullable(FACTORIES.get(type))
      .map(Supplier::get)
      .orElse(null);
  }

Поскольку вы используетецелые числа для идентификации типа, вы можете очень легко использовать массив:

  private static final Supplier<X>[] FACTORIES = new Supplier[] { A::new, B::new };

  public static X createObject(int type) {
    return type > 0 && type <= FACTORIES.length ?
      FACTORIES[type - 1].get() :
      null;
  }
0 голосов
/ 18 сентября 2018

Да, вы можете сделать это без оператора switch.Я предлагаю использовать либо массив, либо Map и Supplier.

Map<Integer, Supplier<X>> map = new HashMap<>();
map.put(1, A::new); // () -> new A()
map.put(2, B::new); // () -> new B()

X createObject(int type) {
    Supplier<X> supplier = map.get(type);
    if (supplier == null) return null;
    return supplier.get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...