Практика Enum - Определить внутри класса / отдельно, сделать общедоступным / частным - PullRequest
9 голосов
/ 26 июня 2011

Что такое хорошая практика при определении перечисления?

Например, у меня есть класс Person. Для этого класса я выбрал перечисление со значениями MALE и FEMALE.

Должно ли перечисление быть определено внутри класса Person или отдельно? Следует ли определять перечисление как частное или общедоступное? Кроме того, есть ли у вас какие-либо дополнительные советы, которые позволили бы использовать enum как можно более гибким?

Ответы [ 2 ]

9 голосов
/ 26 июня 2011

ИМХО, сделайте это public static enum внутри class Person.

Причина в том, что enum Gender применяется только к человеку, поэтому поместите его туда, чтобы они были связаны друг с другом (Пол не имеет смыслабез контекста Person).

Верх:

  • меньше раздувания классов
  • если вы переместите Person в другой пакет / проект, Gender всегда будет сэто
  • Персона, которая является единственным пользователем, имеет «контроль» над ним и может изменять его, как хочет, например:
    • добавление private List<HealthIssue> genderSpecificHealthIssues;
    • добавление дополнительных перечислений,например, TRANSGENDER, INTERSEX или что-то еще

Единственным недостатком является то, что вы должны использовать static для его импорта, то есть import static com.company.Person.Gender.*;.

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

3 голосов
/ 26 июня 2011

Для полной гибкости добавьте его в статический класс.Но, конечно, это только и исключительно для перечислений, которые должны использоваться во всем приложении.Для локальных и специализированных перечислений лучше держать их «близко» к месту их использования. Пример: , у меня есть класс IPHandler, который делает обработку, анализ и перевод адресов IPv4 и IPv6 прозрачными для пользователя класса (IPHandler является статическим классом).У него есть одно перечисление, IPType, со значениями IPv4 и IPv6, которые используются только в IPHandler для нескольких операций.Поскольку он больше нигде не используется, он определен в классе IPHandler.

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