как повторно использовать существующие реализации в перечислениях - PullRequest
0 голосов
/ 26 мая 2020

Я использую перечисления в качестве альтернативы для 250+ случаев внутри коммутатора.

 switch(variable){
  case "NAME":
  case "MIDDLE":
  case "LAST":
    return a();
    break;

  case "SUFFIX":
  case "PREFIX":
     return b();
     break;
   }

У меня проблема с обработкой вышеуказанной ситуации при использовании перечисления.

public enum Action { 
NAME {
@Override
 public String getVariableData() {
  return a();
 }
},LAST {
@Override
public String getVariableData() {
  return a();
 }
},MIDDLE {
@Override
  public String getVariableData() {
     return a();
 }
},SUFFIX {
@Override
 public String getVariableData() {
     return b();
  }
},PREFIX {
@Override
  public String getVariableData() {
     return b();
  }
 };

 public abstract String getVariableData();
 }

Здесь NAME, MIDDLE , ПОСЛЕДНИЙ возвращает то же значение. Но у меня вопрос в том, почему мне нужно выполнять безопасную реализацию и как повторно использовать существующую реализацию. Пожалуйста, помогите мне сократить объем кода при повторном использовании существующих реализаций.

1 Ответ

0 голосов
/ 26 мая 2020

Я полагаю, вы можете создать набор интерфейсов и реализаций, например шаблон стратегии https://www.baeldung.com/java-strategy-pattern:

interface Action {
    String getVariableData();
}

interface ActionA extends Action {
    default String getVariableData() {
        return "a";
    }
}

interface ActionB extends Action {
    default String getVariableData() {
        return "b";
    }
}

enum ActionAImpl implements ActionA {
    NAME, MIDDLE, LAST
}

enum ActionBImpl implements ActionB {
    SUFFIX, PREFIX
}


public static String doAction(Action a) {
   return a.getVariableData();
}

public static void main(String[] args) {
     System.out.println(doAction(NAME));
     System.out.println(doAction(SUFFIX));
}

Или это можно сделать с помощью Карты действий, например:

public static String process (ActionCode code){
    return actions.get(code).getVariableData();
}


Map<ActionCode, Action> actions = new HashMap<>();
actions.put(ActionCode.NAME, DefaultActions::getDefaultVariableData1);
actions.put(ActionCode.MIDDLE, DefaultActions::getDefaultVariableData2);
actions.put(ActionCode.LAST, () -> "custom info");

enum ActionCode {
    NAME, MIDDLE, LAST, ...
}

interface Action {
    String getVariableData();
}

final class DefaultActions {
    static String getDefaultVariableData1() {
        return "a";
    }

    static String getDefaultVariableData2() {
        return "b";
    }
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...