вложенное перечисление - почему оно используется? - PullRequest
6 голосов
/ 18 января 2011

Я видел конструкции с перечислением, объявленным внутри перечисления. Для чего это используется?

Ответы [ 3 ]

7 голосов
/ 18 января 2011

Перечисления в Java не могут быть расширены, поэтому, если вы хотите собирать сильно связанные перечисления в одном месте, вы можете использовать эти вложенные конструкции перечислений.Например:

public enum DepartmentsAndFaculties
{
   UN (null, "UN", "University"),
   EF (UN,   "EF", "Engineering Faculty"),
   CS (EF,   "CS", "Computer Science & Engineering"),
   EE (EF,   "EE", "Electrical Engineering");

   private final DepartmentsAndFaculties parent;
   private final String code, title;

   DepartmentsAndFaculties(DepartmentsAndFaculties parent, String code, String title)
   {
       this.parent = parent;
       this.code   = code;
       this.title  = title;
   }

   public DepartmentsAndFaculties getParent()
   {
       return parent;
   }

   public String getCode()
   {
       return code;
   }

   public String getTitle()
   {
       return title;
   }
}

Здесь внутренние перечисления состоят из комбинаций {parent enum, code, title}.Пример использования:

 DepartmentsAndFaculties cs = DepartmentsAndFaculties.CS;
 cs.getTitle();

Вы можете увидеть мощность вложенных перечислений при построении иерархических сущностей / перечислений.

2 голосов
/ 18 января 2011

Вы можете иметь в виду Enum как внутренний тип. Это чаще всего наблюдается, когда внешний тип является классом или интерфейсом, но я полагаю, что нет никаких причин, по которым это нельзя сделать с помощью enum в качестве внешнего.

Внутренние типы частично связаны с организацией кода. Они могут быть полезны во избежание создания группы отдельных файлов, когда у вас есть несколько связанных типов. Иногда это может сделать имя типа более интуитивным. Например, см. Класс Map и его внутренний класс Entry. В большинстве внешних ссылок на Entry используется формат Map.Entry, который очень удобочитаем.

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

0 голосов
/ 05 апреля 2012

Я использовал вложенные перечисления в тех редких случаях, когда я хотел применить соглашение об именовании значений перечисления, если добавление новых имен будет иметь значение для операций или других людей.Вот один пример:

public enum MessageTemplateName {

    account_verify,
    vendor_job_request,
    account_job_confirmed,
    vendor_job_confirmed,
    account_friend_request,
    account_job_accepted,
    vendor_job_accepted_by_other;

    /** Make sure you tell operations if you're adding a new recipient */
    private enum Recipient { account, vendor }

    private Recipient recipient;
    private String messageName;

    MessageTemplateName () {
        final int firstUnderscore = name().indexOf('_');
        recipient = Recipient.valueOf(name().substring(0, firstUnderscore));
        messageName = name().substring(firstUnderscore+1);
    }

    public String getTemplateUrl (String baseUrl) {
        if (!baseUrl.endsWith("/")) baseUrl += "/";
        return baseUrl + recipient.name() + "/" + messageName + ".vm";
    }

}

Я использую Enum, потому что хочу иметь возможность передавать общее «имя шаблона сообщения» в разных местах.Как видите, первая часть имени enum соответствует каталогу на сервере, а остальная часть имени относится к имени файла шаблона Velocity.Если коллеги-инженеры начали вводить новые константы, я бы хотел убедиться, что они были поданы под соответствующим «получателем», или если законно требуется создать нового получателя, что это сознательное усилие, и вы сообщитеоперации (создайте каталог в производственной среде, установите любые мониторинг / разрешения и т. д.).

Есть достойный аргумент, что если в какой-то момент ваш Enum станет слишком сложным, вы можете заменить его классом / классомиерархия в сочетании с гораздо более простым перечислением.Не уверен, где я рисую линию, но я полагаю, что вышеизложенное движется в этом направлении.

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