繁体   English   中英

为什么不从枚举扩展<e extends enum<e> ></e>

[英]Why not extending from Enum<E extends Enum<E>>

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

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

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

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

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

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

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

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

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

重要的是要记住,您永远不应该自己使用ordinal() ,因此根据您的问题定义它是没有意义的。

Enum class 在 Java 中是特殊的,因为它用于实现 Enum 语言功能。 因此,它不仅是 class,与 Java 中的任何其他 class 一样,而且更特殊(如String ,其+运算符已重载,或如盒装类)。 为了使这些功能起作用,需要对枚举有特殊要求(比如,我猜,连续的序数)。 因此 Java 语言规范明确禁止手动继承Enum class。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM