どのように列挙型クラスは、他の外部ライブラリのクラスを拡張することができますか?

qwop72:

今、私は私が列挙型であることをリファクタリングしたいと既存のクラスを持っています。クラスは現在、外部のライブラリから別のクラスを拡張します。私はまだその拡張クラスからいくつかのロジックから利益のために希望通り一方リファクタリングしたいと思います。それはどのように行われるべき?

Javaでは、enum一方のクラスは他のクラスを拡張することができない、それはインタフェースを実装することができますそれとも、列挙型であることを、それをリファクタリングするという考えのために間違っすでにありますか?私は以下のコード例では、それをお見せしましょう。

既存の既存のクラスが別のクラスの親を拡張して、親クラスが外部のライブラリからであり、それはインタフェースではありませんと仮定します。

class Existing extends Parent{
    public static final Existing A = new Existing(...);
    ....
    public static final Existing Z = new Existing(...);

    public Existing(Srting attr1, String attr1){
        super(attr1, attr2);
    }

    public Existing(String attr1){
       super(attr1);
    }
}

アイデアは例えば、列挙型であることを、これらのstatic finalフィールドを持つことです。

enum NewDesign{
     A(attr1, attr2),
     B(attr1),
     C(attr1, attr2)
     //...;
     //constructor etc.
     //...
}

おそらく以下のように追加された新しい余分のattrで、必要なときに:

enum NewDesign{
  A(attr1, attr2, newAttr),
  B(attr1, newAttr),
  C(attr1, attr2, newAttr),
  //...
  //constructor etc.
  //...
}
ernest_k:

あなたが必要とすることを主な変更点は、静的なfinalフィールドを取り除くために列挙型を作成することであるならば、それについて移動する最も簡単な方法は、初期化されたインスタンスと異なる、列挙型を作成することです:

enum ExistingEnum {
    A("attr1", "attr2"), 
    Z("attr");

    private final Existing existing;

    ExistingEnum(String attr1) {
        this.existing = new Existing(attr1);
    }

    ExistingEnum(String attr1, String attr2) {
        this.existing = new Existing(attr1, attr2);
    }

    public Existing getExisting() {
        return existing;
    }
}

あなたが使用している方法に応じてExisting、現在クラスを、あなたはまだ列挙にそれを変更することができるかもしれません。次の例では、Iは、のインスタンスを露出Parent使用コードと仮定すると、列挙にExisting呼び出すように変更することができますExisting.A.getParent().parentMethod()...

enum Existing {
    A("attr1", "attr2"),

    Z("attr");

    private final Parent existing;

    Existing(String attr1) {
        this.existing = new ParentImpl(attr1);
    }

    Existing(String attr1, String attr2) {
        this.existing = new ParentImpl(attr1, attr2);
    }

    public Parent getParent() {
        return existing;
    }

    // only needed if logic is overridden
    private static class ParentImpl extends Parent {
        public static final Existing A = "";
        public static final Existing Z = "";

        public ParentImpl(String attr1, String attr2) {
            super(attr1, attr2);
        }

        public ParentImpl(String attr1) {
            super(attr1);
        }
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229167&siteId=1