Java Cascading Enums? - PullRequest
       5

Java Cascading Enums?

1 голос
/ 19 апреля 2010

В моем проекте у меня есть такой класс:

class Statut {
    String satDomain;
    String staCode;
}

Но работать со строками не то, что я хочу. Это слишком разрешительно, и использование констант недостаточно.

Я хотел использовать перечисления, но нашел проблему:

class Statut {
    Domain satDomain;
    StatutCode staCode;
}
enum Domain { }
enum StatutCode { }

Это решение намного лучше, но вы можете установить StatutCode, который находится не в выбранном Домене.

Нашли ли вы в своем проекте решение такой проблемы?

Спасибо за вашу помощь

Fluminis

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

На самом деле небольшое улучшение ответа Экстранеона.

Сначала определите перечисление StatutCode, а затем присвойте EnumSet каждому значению перечисления Domain. Тогда проверка очень проста в Statut конструкторе

enum StatutCode
{
  ONE,
  TWO,
  THREE,
  FOUR
};

enum Domain
{
  DOMAIN_1( EnumSet.of( StatutCode.ONE, StatutCode.TWO ) ),
  ...
  DOMAIN_N( EnumSet.of( StatutCode.TWO, StatutCode.THREE ) );

  private final EnumSet< StatutCode> validStatCodes;

  Domain( EnumSet< StatutCode > validStatCodes )
  {
    this.validStatCodes = validStatCodes;
  }

  public boolean isValidCode ( final StatutCode code )
  {
    return validStatCodes.contains( code );
  }
}

class Statut {
    final Domain staDomain;
    final StatutCode staCode;

    Statut(
      final Domain staDomain,
      final StatutCode staCode
    )
    {
      if ( ! staDomain.isValidCode( staCode ) )
      {
        throw new IllegalArgumentException(
            "Invalid code " + staCode + " for domain " + staDomain
          );
      }

      this.staDomain = staDomain;
      this.staCode = staCode;
    }

}
2 голосов
/ 19 апреля 2010

Я обычно не нахожу это проблемой. Я склонен использовать неизменяемую карту проверки () `, если проверка во время выполнения достаточна или содержимое извлекается из базы данных.

Вы можете добавить такой валидатор в Statut. Сделайте единственный установщик типа setDomainAndStatutCode(Domain domain, StatutCode statutCode) и проверьте, допустим ли ввод.

В противном случае я бы использовал enum DomainAndStatutCode. Конечно, много работы и обслуживания, так что это не очень хорошее решение. Может быть хорошо, если набор данных ограничен и правильность обязательна.

2 голосов
/ 19 апреля 2010

Я предлагаю сделать ваши поля private и final и добавить конструктор, который проверяет, что построенный объект правильно сформирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...