Любой способ обеспечить соблюдение в значениях перечисления Java? - PullRequest
0 голосов
/ 12 апреля 2019

Рассмотрим следующие перечисления:

public enum AllColors {
    WHITE,
    RED,
    GRAY,
    GREEN,
    BLUE,
    BLACK
}

public enum GrayscaleColors {
    WHITE,
    GREY,
    BLACK
}

Существует несоответствие между перечислениями (СЕРЫЙ / СЕРЫЙ) - но нет способа отловить эту опечатку во время компиляции.Это может создать проблемы, если система использует хранилище БД или систему обмена сообщениями и вынуждена преобразовывать значения перечисления на основе их значения.

Хотелось бы сделать что-то подобное:

public enum GrayscaleColors {
    AllColors.WHITE,
    AllColors.GRAY,
    AllColors.BLACK
}

, ноэто кажется невозможным.

1 Ответ

3 голосов
/ 12 апреля 2019

Вы можете объявить конструктор и сравнить имена в конструкторе:

public enum GrayscaleColors {
    WHITE(AllColors.WHITE),
    GREY(AllColors.GRAY),
    BLACK(AllColors.BLACK);

    GrayscaleColors(AllColors ac) {
      if (!name().equals(ac.name()) throw new IllegalArgumentException();
    }
}

Кроме того, вы можете просто использовать AllColors.valueOf:

public enum GrayscaleColors {
    WHITE,
    GREY,
    BLACK;

    GrayscaleColors() {
      // Will throw if no corresponding name exists.
      AllColors.valueOf(name());
    }
}

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

...