Сокращение операторов 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, чтобы не иметь такой код?
Ответы
Ответ 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.