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

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

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

在构造分层实体/枚举时,您可以看到嵌套枚举的强大function。

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

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

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

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

 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变得太复杂,你可以用一个类/类层次结构加上一个更简单的枚举来替换它。 不确定我画线的位置,但我想上面的方向正朝这个方向发展。