Java中的可扩展枚举,无需使用扩展

时间:2013-01-17 08:46:30

标签: java enums extends

  

可能重复:
  Is it possible to extend Java Enums?

我有一个小问题,我有一个具有一定数量值的枚举。此枚举用于系统的多个部分,在某些情况下需要包含更多值。

由于在Java中不允许扩展枚举,我试图想到一些替代方案,到目前为止我的解决方案是创建一个包含枚举的接口,该枚举具有系统所有部分的通用值,然后创建一个空类实现这个接口。

所以enum A implements I所以我可以使用A.COMMON_ENUM.ENUM_VALUE

现在我可以在系统的某个子部分创建一个新的enum B,其中包含一个枚举ADDITIONAL_ENUM,它实现了I。所以现在我可以用它:

B.COMMON_ENUM.ENUM_VALUE

B.ADDITIONAL_ENUM.ADDED_ENUM_VALUE

这是一个丑陋的解决方案吗? - 我的意思是,它有效,但似乎错误 ......

-----更新:-----

公共枚举位于系统的“核心”部分(可以有多个前端),每个前端的附加枚举也各不相同。所以使用类比:让我们说车辆枚举有引擎,DOORS然后在我的CAR前端我需要添加“WHEELS”并且在我的BOAT前端我需要添加“PROPELLER”

代码示例:

public interface EnumType {           // I
    public enum Core {
    VALUE1,
    VALUE2,
    VALUE3
    }
}

public enum CommonEnum implements EnumType {     // A

}

public enum AdditionalEnumType implements EnumType {     // B
    public enum Additional {
    VALUEX,
    VALUEY
    }
}

3 个答案:

答案 0 :(得分:6)

我会使用类似的模式,但我不明白你为什么要把它们全部嵌入你的模式中。我的看起来像这样:

interface SomeType {
  String name();
}

public enum CoreEnum implements SomeType {
  VALUE1,
  VALUE2;
}

public enum AdditionalEnum implements SomeType {
  VALUE3,
  VALUE4;
}

答案 1 :(得分:1)

您可能会为此目的阅读typesafe enum pattern。介绍界面你没问题。所以你应该只依赖于API中的那个接口。如果该接口的实现是由枚举或类完成的,则应该与API用户无关。

我看不出有什么坏事。

答案 2 :(得分:0)

您可以创建类似于enum by design的自己的类

public class A {
    A() {}  
    public static final A A1 = new A();
    public static final A A2 = new A();
    @Override
    public String toString() {
        return getClass().getSimpleName();
    }
}

public class B extends A {
    B() {}
    public static final A A3 = new A();
}