是否可以扩展Java Enums?

时间:2010-04-15 01:57:39

标签: java enums

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

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包含所有十六进制数字。这可能吗?

5 个答案:

答案 0 :(得分:34)

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

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;
  }
}

答案 1 :(得分:6)

没有

枚举不能被子类化。

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

答案 2 :(得分:4)

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

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

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

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

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

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

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

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

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

答案 3 :(得分:2)

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

  void checkwinner(void){
             if(match(1,2,3)){
                 return;
             }
             if(match(4,5,6)){
                   return;
             } ... 

现在你可以这样做:

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的有效选项。

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

答案 4 :(得分:-5)

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

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