亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

枚舉類如何擴展另一個外部庫類?

枚舉類如何擴展另一個外部庫類?

鴻蒙傳說 2023-04-19 15:38:32
現在我有一個現有的類,我想將其重構為一個枚舉。該類當前擴展了另一個來自外部庫的類。因為我仍然想從那個擴展類的一些邏輯中受益,同時我想重構。應該怎么做?在 Java 中,一個enum類不能擴展另一個類,但它可以實現接口。還是將其重構為 Enum 的想法已經錯了?讓我在下面的示例代碼中展示它。假設現有類 Existing 正在擴展另一個類 Parent 并且 Parent 類來自外部庫并且它不是接口。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);    }}這個想法是讓那些靜態的最終字段成為枚舉,例如:enum NewDesign{     A(attr1, attr2),     B(attr1),     C(attr1, attr2)     //...;     //constructor etc.     //...}并可能在需要時添加新的額外屬性,如下所示:enum NewDesign{  A(attr1, attr2, newAttr),  B(attr1, newAttr),  C(attr1, attr2, newAttr),  //...  //constructor etc.  //...}
查看完整描述

3 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

如果您需要的主要更改是創建一個枚舉以擺脫靜態最終字段,那么最簡單的方法是創建一個不同的、帶有初始化實例的枚舉類型:


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當前使用課程的方式,您仍然可以將其更改為枚舉。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);

        }

    }

}


查看完整回答
反對 回復 2023-04-19
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

我認為你可以使用組合:


public class Parent {

    private String attr1;

    private String attr2;


    public Parent(String attr1, String attr2) {

        this.attr1 = attr1;

        this.attr2 = attr2;

    }


    public void doSomething() {

        // do something.

    }

}


// compose the class Parent

public enum NewDesign {

    A("attr1", "attr2"),

    B("attr1", "attr2")

    ;


    private Parent parent;


    NewDesign(String attr1, String attr2) {

        this.parent = new Parent(attr1, attr2);

    }

    public void func() {

        parent.doSomething();

    }

}


查看完整回答
反對 回復 2023-04-19
?
森林海

TA貢獻2011條經驗 獲得超2個贊

因為我仍然想從那個擴展類的一些邏輯中受益,同時我想重構。

繼承并不是您可以從庫類中編寫的邏輯中獲益的唯一方法。組合(Parent在 中有一個字段Existing)可能有效。

現在我有一個現有的類,我想將其重構為一個枚舉。

為什么枚舉?您的類有兩個構造函數,這意味著您希望創建新實例Existing而不管已經定義的對象A......。Z這不是枚舉背后的想法。

并可能在需要時添加新的額外屬性

當出現新屬性時重構所有常量可能會很乏味。您將在添加新屬性后立即修改類。在我看來這不太合理,而且它有點違反了開閉原則——你并沒有真正對枚舉的擴展持開放態度。


查看完整回答
反對 回復 2023-04-19
  • 3 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號