1

私は現在、そのように定義された列挙型を使用しています:

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

よろしくお願いします!

4

3 に答える 3

9

Java ではこれに問題がありますが、必要なものの多くを提供する解決策は、すべての列挙型に共通のインターフェイスを実装させることです。

インターフェイスを実装するメソッドのコードを再利用するのは困難ですが、実際の作業を外部のメソッドに委譲することで被害を軽減できます。

enumまた、正確なクラスに関係なく、適切な列挙型メンバーを提供する名前によるルックアップ関数が必要になることがよくあります。HashMapこれは、すべての列挙メンバーを集約するセパレートを使用して実現できます。

基本的に、これは私が現在プロジェクトで行っている方法の概要です。

于 2012-08-23T12:20:20.273 に答える
4

Enum は Java で拡張できません。

于 2012-08-23T12:17:20.050 に答える
4

Enum を拡張することはできませんが、共通のインターフェイスを実装して機能を追加することはできます。

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
   }
}
于 2012-08-23T12:20:45.840 に答える