4

我偶然发现了以下问题,我无法从 Java 1.5(java.lang 包)中定义的此类扩展和实现

public abstract class Enum<E extends Enum<E>> {...
}..

我遇到的问题是创建我自己的具有不同序数值的枚举类型。我不想通过使用不同的序数名称来实现它,比如 getCode() 等。所以我想我可以去扩展上面的类。

public final class XYZ extends Enum<XYZ> { //Does not work.
  //
  A("A", 1),
  B("B", 7);
  .
}

我知道我可以做到以下几点:

public enum NEWEnum {
   A(1),
   B(7);

   private int code;
   private NEWEnum(int code) {
     this.code = code;
   }
   public int getCode() {
     return this.code;
   }
}

我宁愿在 Enum 中使用通常的命名,例如 ordinal() 和 name()。

4

5 回答 5

5

你不能像那样扩展 Enum 。它内置于编译器或运行时(不确定是哪个)。

但是看起来您正在尝试解决错误的问题;枚举值的序数不应该具有任何功能意义。一旦你给它一个,它应该有一个不同于“Ordinal”的名字。您的第二个代码片段远远优于您的第一个。

一般来说,依靠序数来做任何事情都是不好的做法。它可能一开始就不应该被曝光。您唯一可以依赖的是名称以及您自己分配的任何值。

如果将字段命名为“序数”对您来说很重要,只需使用类型安全枚举模式(第 21 项),Enum 只是其实现。

于 2012-04-10T08:27:56.073 回答
4

Enum 得到编译器的特殊处理,像 EnumSet 这样的类基于这种处理做出假设。Enum 方法的行为像ordinal()name()是严格定义的,并且自己实现它们以复制这种行为是没有意义的。此外,声明枚举值的语法仅在 an 中有效,enum而不会在 a 中编译class

重要的是要记住,你永远不应该使用ordinal()自己,所以定义它来适应你的问题是没有意义的。

于 2012-04-10T08:28:09.960 回答
1

该类Enum在 Java 中是特殊的,因为它用于实现 Enum 语言功能。因此,它不仅仅是一个类似于 Java 中任何其他类的类,而是更特殊的类(比如String+运算符被重载的类,或者像装箱的类)。要使这些功能正常工作,枚举需要特殊要求(我猜是连续序数)。因此,Java 语言规范明确禁止Enum从类手动继承。

于 2012-04-10T08:28:50.703 回答
0

枚举在语言核心和特殊用途中具有特殊意义。因此,您可以在switch语句中使用它们,这对于普通类是不可能的。

于 2012-04-10T08:29:18.653 回答
0

例如,如果显式实现它,则不必在构造函数中初始化“name”和“ordinal”的属性。以后可能会导致NPE。

于 2013-06-20T07:13:41.420 回答