嵌套枚举 - 为什么使用它?

时间:2011-01-17 23:20:24

标签: java enums

我已经看到在枚举中声明了枚举的构造。这是用来做什么的?

3 个答案:

答案 0 :(得分:7)

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();

构建分层实体/枚举时,您可以看到嵌套枚举的强大功能。

答案 1 :(得分:2)

你可能意味着Enum是一种内在类型。当外部类型是类或接口时,这通常是最常见的,但我认为没有任何理由不能将枚举作为外部来完成。

内部类型部分与代码组织有关。当您有一些相关的类型时,它们可以避免创建一堆单独的文件。有时它可以使类型名称更直观。例如,请参阅Map类及其内部Entry类。对Entry的大多数外部引用都使用Map.Entry格式,这种格式非常易读。

内部类型的另一个原因是,如果外部类型是类或枚举,则内部类型可以是非公共类型。这对于隐藏作为外部类型的实现细节的类型非常有用。

答案 2 :(得分:0)

我在极少数情况下使用了嵌套枚举,我想对枚举值强制执行命名约定,如果添加新名称会对操作或其他人产生影响。这是一个例子:

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,因为我希望能够在各个地方传递通用的“消息模板名称”。如您所见,枚举名称的第一部分对应于服务器上的目录,名称的其余部分指的是Velocity模板文件名。如果同事们开始介绍新的常量,我想确保它们是在适当的“接收者”下提交的,或者如果合法地需要创建新的接收者,那么这是有意识的努力,并且你会告知操作(在生产中创建目录,放置任何监视/权限等)。

有一个不错的论点,如果在某些时候你的Enum变得太复杂,你可以用一个类/类层次结构加上一个更简单的枚举来替换它。不知道我在哪里划线,但我想上面的方向正朝这个方向发展。

相关问题