是否可以扩展Java Enums?

这是我想要完成的,我有一个类具有一些值的枚举,我想inheritance它并为枚举添加更多的值。 这是一个糟糕的例子,但是:

public class Digits { public enum Digit { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } public class HexDigits extends Digits { public enum Digit { A, B, C, D, E, F } } 

以便HexDigits.Digit包含所有hex数字。 那可能吗?

不,这是不可能的。 您可以做的最好的事情是制作两个枚举器和接口,然后使用该接口而不是枚举。 所以:

 interface Digit { int getValue(); } enum Decimal implements Digit { ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE; private final int value; Decimal() { value = ordinal(); } @Override public int getValue() { return value; } } enum Hex implements Digit { A, B, C, D, E, F; private final int value; Hex() { value = 10 + ordinal(); } @Override public int getValue() { return value; } } 

没有。

枚举不能被子类化。

这里的推理是枚举定义了固定数量的值。 子类化会破坏这一点。

不,你不能。 如果你看一下Enum的定义,它的实例是最终的,不能扩展。 如果您将枚举理解为有限的最终值集,则这是有意义的。

一个数字(一个句法工件)可能是二进制,十进制,hex或其他什么,实际的语义数字,数字实体在语境中表示的数字实体(基本系统)。

在您的示例中,您需要的是

  • 枚举指定合成数字(十进制数字和表示合法hex的字母符号;即枚举令牌,和
  • 指定语法上将数字表示为数字所需的行为(或语法)的类(使用数字[syntactic]枚举)。

也就是说,您有令牌或符号以及表示令牌流是否代表给定基数下的数字的语法/行为。

但是这有点偏离切线(正如你所说,这只是一个例子的例子)。 回到扩展枚举……

…哟不能,你不应该。 枚举并不意味着代表可以扩展的事物。 它们用于表示一组常量常量值 。 有些东西是不可inheritance的。

此外,不要为了扩展或者试图强制将结构强加到代码或模型中而陷入延伸的陷阱。

将一组值作为另一组的扩展似乎是有意义的。 通常情况下,情况并非如此。 使用inheritance来重用行为或复杂结构,而不仅仅是几乎没有结构且具有与之关联的不可重用行为的数据。

这是不可能的。 而且有一个原因。 想象一下,你可以扩展枚举:

 enum A { ONE, TWO } enum B extends A { THREE } // for a total { ONE, TWO, THREE } 

现在你可以这样做:

 B b = B.THREE A a = b // a = B.THREE ? 

B.THREE不是A的有效选择。

当然你可以让它们不是多态的,但它并没有真正扩展。

同意enum的意思不是要扩展……但是当面对Tapestry 5时选择组件……并且它的enum版本是最好的版本….相比于(荒谬的?)复杂的对象模型示例那里…可以看出扩展和枚举对于这种情况有多大吸引力……

btw(seque抱怨)什么是挂毯扔掉而不是建立/最好地练习jsp框架? 充其量这会创建一个ui开发部门,这使得Java技术对于体验更加困难…