Java - Как я могу использовать перечисления типа Safe в качестве оператора switch-case? - PullRequest
0 голосов
/ 07 июня 2018

Я занимаюсь разработкой Java-программы, в которой мне нужно использовать следующий TypeSafeEnum (который указан во внешнем компоненте):

public class MyInterfaceTypeEnum
    extends TypeSafeEnum
{
    public MyInterfaceTypeEnum(String paramString, int paramInt)
    {
        super(paramString, paramInt);
    }

    public static final MyInterfaceTypeEnum UNKNOWN = new MyInterfaceTypeEnum("UNKNOWN", 0);
    public static final MyInterfaceTypeEnum TCP = new MyInterfaceTypeEnum("TCP", 10);
    public static final MyInterfaceTypeEnum UDP = new MyInterfaceTypeEnum("UDP", 20);
    public static final MyInterfaceTypeEnum IPX = new MyInterfaceTypeEnum("IPX", 30);
    public static final MyInterfaceTypeEnum RS232 = new MyInterfaceTypeEnum("RS232", 40);
}

В моем классе задач-процессов используется следующий метод:

private void processInterface(MyInterfaceTypeEnum type)
{
    switch(type)
    {
    case RS232:
        {
            // do action
            break;
        }
    case TCP:
    case UDP:
        {
            // do action
            break;
        }
    case IPX:
        {
            // do action
            break;
        }
    case UNKNOWN:
    default:
        {
            // do default action
            break;
        }
    }
}

Сбой компилятора в строке оператора switch со следующим сообщением:

Невозможно включить значение типа MyInterfaceTypeEnum.Разрешены только конвертируемые значения типа int, строки или перечислимые переменные.

Я гуглил, но везде было написано: этот шаблон TypeSafeEnum может подойти.Пожалуйста, дайте мне идеи, как обойти это.

ОБНОВЛЕНО:

Важно отметить, что реализация MyInterfaceTypeEnum не может быть изменена мной (эточасть использованного (импортированного) компонента).Поэтому я вынужден использовать это.Итак, основная ситуация такова: «enum» (неправильно используемый класс) уже задан.

Если бы я отказался от использования MyInterfaceTypeEnum, я также не смог бы использовать много функций (использующих этотТип-безопасный-enum интенсивно).Поэтому у меня нет другого выбора, кроме как принять это и попытаться найти простейшую возможность.

Я знаю, что можно использовать дерево операторов if-else.Но я хочу этого избежать.Поскольку MyInterfaceTypeEnum был добавлен во внешний компонент (реализован другими, и я не могу его изменить).

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Работы вокруг нет.Легко и просто.

Встроенный оператор switch работает только со значениями типа int, String или (встроенными).Точно так же, как это сообщение об ошибке говорит вам.Поэтому у вас остаются цепочки if / else или, может быть, каскад операторов if с оператором return в каждом блоке if.

Или вы создаете истинное перечисление Java, которое оборачивается вокруг существующего сломанного класса перечисленияваша.Другими словами: вы создаете дополнительный уровень защиты, чтобы на весь код, который вы создадите, не влиял тот класс enum, который вы вынуждены использовать.Для этого есть даже название: антикоррупционный слой.

0 голосов
/ 07 июня 2018

Если у вас есть имя поля или значение поля в TypeSafeEnum с общедоступным средством получения доступа, в котором хранятся значения конструктора TypeSafeEnum (String paramString, int paramInt), вы можете:

private void processInterface(MyInterfaceTypeEnum type){
switch(type.getName()) {
case "RS232":
    {
        // do action
        break;
    }
case "TCP":

илисделать то же самое с getter для значения (которое было бы менее читабельным.).Подход @ GhostCat по превращению вашего класса в настоящее перечисление выглядит мне лучше.

0 голосов
/ 07 июня 2018

Поскольку в Java поддерживаются перечисления java 1.5

public enum Protocols {
   TCP,
   UDP,
   PCX
}

....
void processInterface(Protocols proto) {

  switch(proto) {
     case TCP: ...
     case UDP: ...
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...