Подтвердить что ты не робот

Сокращение операторов if-else в Java

У меня есть следующий код:

void f(String t)
{
  if(t.equals("a"))
  {
    someObject.setType(ObjectType.TYPE_A);
  }
 else if(t.equals("b"))
  {
    someObject.setType(ObjectType.TYPE_B);
  }

// 50 more similar code

}

Есть ли простой способ переписать условие if-else, чтобы не иметь такой код?

4b9b3361

Ответ 1

Вы должны использовать что-то, чтобы исключить повторение someObject.setType(ObjectType....)) Если ObjectType является enum, тогда напишите метод, похожий на valueOf, который достигнет этого. Посмотрите, нравится ли вам такое решение:

void f(String t) { someObject.setType(ObjectType.byName(t)); }

enum ObjectType {
  TYPE_A, TYPE_B;
  public static ObjectType byName(String name) {
    return valueOf("TYPE_" + name.toUpperCase());
  }
}

Ответ 2

Используйте Map (который вам нужно будет заполнить), который отображает из String в любой тип ваших значений ObjectType.TYPE_x есть.

Ответ 3

Я бы добавил это как функциональность перечисления:

public enum ObjectType {
    TYPE_A("a"),
    TYPE_B("b");

    private String stringType;

    private ObjectType(String stringType) {
        this.stringType = stringType;
    }

    public String getStringType() {
        return this.stringType;
    }

    public static ObjectType fromStringType(String s) {
        for (ObjectType type : ObjectType.values()) {
            if (type.stringType.equals(s)) {
                return type;
            }
        }
        throw new IllegalArgumentException("No ObjectType with stringType " + s);
    }
}

...

void f(String t) {
    someObject.setType(ObjectType.fromStringType(t));
}

Ответ 4

Если вы можете реорганизовать t в char, вы можете вместо этого использовать switch (Java 6):

void f(char t) {

  switch(t) {

    case 'a`:
      someObject.setType(ObjectType.TYPE_A);
      break;
    case 'b':
      someObject.setType(ObjectType.TYPE_B);
      break;

    // ...

  }

}

Как отметил Марко, вы можете пойти с String тоже в Java 7.

Это не намного короче, но более элегантно. Более того, я думаю, что это может быть и быстрее, так как switch работает с O(1) с таблицами переходов (может ли кто-нибудь подтвердить, является ли это истинным?), Является ли число операторов if O(n).

Для более сложных реализаций, чем просто один setType, вы можете придумать State Pattern.

Ответ 5

1. Вы можете перейти на инструкцию Switch, если у вас есть число условий, превышающих 3.

2. Вы можете преобразовать свои операторы if else в тернарные операции

Ответ 6

Другие предложения велики - особенно умнее перечисления и карты. Но первый наиболее базовый рефакторинг, который я бы рассмотрел здесь, заключается в том, чтобы извлечь метод, чтобы возвращать перечисление напрямую и чтобы вызывающий абонент выполнял не что иное, как setType, для возвращаемого значения этого метода.

void f(String t) {
  final ObjectType type = findType(t);
  if (type != null)
    someObject.setType(type);
  }

ObjectType findType(String t) {
  if (t.equals("a")) return ObjectType.TYPE_A;
  if (t.equals("b")) return ObjectType.TYPE_B;
  // 50 more similar code
  }

В некоторых случаях это будет само по себе; в других случаях метод findType() может привести к простому решению на основе карты или enum.