创建一个枚举的超类

时间:2012-08-23 12:15:53

标签: java inheritance enums

我目前使用这样定义的枚举:

public enum Language{
    English("english", "eng", "en", "en_GB", "en_US"),
    German("german", "de", "ge"),
    Croatian("croatian", "hr", "cro"),
    Russian("russian");

    private final List<String> values;

    Language(String ...values) {
        this.values = Arrays.asList(values);
    }

    public List<String> getValues() {
        return values;
    }
    public static Language find(String name) {
        for (Language lang : Language.values()) {
            if (lang.getValues().contains(name)) {
                return lang;
            }
        }
        return null;
    }
}

事实是,我将不得不使用相同的方法和构造函数使用几个枚举。在我的例子中唯一改变的是枚举本身的值。

有没有办法让我创建一个可以重用的枚举的超类?

所以我可以做类似的事情:

public Language extends(specializedEnum){
        English("english", "eng", "en", "en_GB", "en_US"),
        German("german", "de", "ge"),
        Croatian("croatian", "hr", "cro"),
        Russian("russian");
}

提前谢谢!

3 个答案:

答案 0 :(得分:9)

在Java中存在这方面的困难,但是为您提供所需内容的解决方案是使您的所有枚举实现一个通用接口。

您将无法重复使用实现该接口的方法的代码,但您可以通过将实际工作委托给外部方法来减轻损害。

此外,通常需要按名称查找功能,无论确切的enum类如何,都会为您提供正确的枚举成员。这可以使用聚合所有枚举成员的单独HashMap来完成。

基本上,这是我现在在项目中如何做的概述。

答案 1 :(得分:3)

Enum不能用Java扩展。

答案 2 :(得分:3)

它根本无法扩展Enums,但您可以实现一个通用接口来添加额外的功能。

public interface BaseLanguage {
   public void doStuff();
}

public enum Language implements BaseLanguage {
    English("english", "eng", "en", "en_GB", "en_US"),

   // etc.

   @Override
   public void doStuff() {
     // do work based on current Language enum
   }
}