【问题标题】:Create a superclass of enum创建枚举的超类
【发布时间】:2012-08-23 12:15:52
【问题描述】:

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

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

提前谢谢你!

【问题讨论】:

  • Java extend enum 的可能重复项
  • 至少你只能实现接口来保证兼容性。
  • 感谢 Keppil,但我已经读过那个。值不会相同,只有方法会
  • 答案仍然成立,你不能扩展enums,也不能enum 扩展任何东西。但是,如果有帮助,它可以实现 interface

标签: java inheritance enums


【解决方案1】:

这在 Java 中存在一些困难,但能够满足您大量需求的解决方案是让所有枚举都实现一个通用接口。

重用实现接口的方法的代码会遇到麻烦,但可以通过将实际工作委托给外部方法来减轻损失。

此外,通常需要一个按名称查找的函数,它可以为您提供正确的枚举成员,而不管确切的 enum 类如何。这可以使用聚合所有枚举成员的单独HashMap 来完成。

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

【讨论】:

  • 谢谢马尔科!虽然这看起来相当复杂,但是(我认为)对头脑来说很容易。我主要关心的是避免代码重复。但是只有 4 或 5 个这样的枚举,我还不如复制/粘贴:s
  • 我相信我有 6 个枚举,拥有这种架构非常值得,因为我绝对需要对枚举成员的类型进行调度。没有其他东西可以取代这个好处,所以如果我不使用它只会增加更多代码。
  • 感谢您的帮助,您肯定让我走上了正轨。我认为从外部完成工作可能是最干净的解决方案
【解决方案2】:

枚举不能在 Java 中扩展。

【讨论】:

    【解决方案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
       }
    }
    

    【讨论】:

    • 这就是我需要的!
    猜你喜欢
    • 2013-11-06
    • 2022-01-09
    • 1970-01-01
    • 2015-02-10
    • 2021-03-17
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多