Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决枚举没有继承的问题?_Java_Inheritance_Enums - Fatal编程技术网

Java 如何解决枚举没有继承的问题?

Java 如何解决枚举没有继承的问题?,java,inheritance,enums,Java,Inheritance,Enums,我有几种编码为枚举的有限列表类型,它们看起来都与此完全相同,当然,不同枚举的实际值除外: public enum SomeType { TYPE_A("A", "Type A Description"), TYPE_B("B", "Type B Description"), TYPE_C("C", "Type C Description"); private String key; private String label; private

我有几种编码为枚举的有限列表类型,它们看起来都与此完全相同,当然,不同枚举的实际值除外:

public enum SomeType {

    TYPE_A("A", "Type A Description"),
    TYPE_B("B", "Type B Description"),
    TYPE_C("C", "Type C Description");

    private String key;
    private String label;

    private static Map<String, SomeType> keyMap = new HashMap<String, SomeType>();  

    static {
        for(SomeType type : SomeType.values()) {
            keyMap.put(type.getKey(), type);
        }
    }

    private SomeType(String _key, String _label) {
        this.key = _key;
        this.label = _label;

    }

    public String getKey() {
        return this.key;
    }

    public String getLabel() {
        return this.label;
    }

    public static List<SomeType> getValueList() {
        return Arrays.asList(SomeType.values());
    }

    public static SomeType getByKey(String _key) {
        SomeType result = keyMap.get(_key);

        if(result == null) {
            throw new IllegalArgumentException("Invalid key: " + _key);
        }

        return result;
    }
}
注意,它们都应该具有相同的构造函数/格式String\u键、String\u标签以及按字符串查找的方法和支持映射


Java枚举不支持继承。有没有一个聪明的解决办法,可以让我在一个基类中声明所有重复的样板文件,然后让枚举psudo从那里继承它们?

我猜你是说公共枚举报告类型?泛型呢?不是扩展它们,这是关于将共享模式集中在一个位置,而不是在每个枚举中重复它们……对不起,然后我收回我的评论并结束投票;您可以做的是在枚举类型中声明抽象方法,这些方法在每个枚举值中实现;此外,枚举类型可以实现接口。但我怀疑,这里真正的问题是枚举被误用了,因为key和label看起来可能是枚举名和toString值;而不是使用getByKeyString方法,而是直接使用枚举值,例如,它们可以很容易地从JPA/Hibernate实体中存储/恢复。