第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

鴻蒙傳說 2023-04-19 15:38:32
現(xiàn)在我有一個現(xiàn)有的類,我想將其重構(gòu)為一個枚舉。該類當前擴展了另一個來自外部庫的類。因為我仍然想從那個擴展類的一些邏輯中受益,同時我想重構(gòu)。應該怎么做?在 Java 中,一個enum類不能擴展另一個類,但它可以實現(xiàn)接口。還是將其重構(gòu)為 Enum 的想法已經(jīng)錯了?讓我在下面的示例代碼中展示它。假設(shè)現(xiàn)有類 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);    }}這個想法是讓那些靜態(tài)的最終字段成為枚舉,例如: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條經(jīng)驗 獲得超9個贊

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


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;

    }

}

根據(jù)您Existing當前使用課程的方式,您仍然可以將其更改為枚舉。Parent在下面的示例中,我在枚舉上公開了一個實例,假設(shè)使用的代碼Existing可以更改為調(diào)用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條經(jīng)驗 獲得超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條經(jīng)驗 獲得超2個贊

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

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

現(xiàn)在我有一個現(xiàn)有的類,我想將其重構(gòu)為一個枚舉。

為什么枚舉?您的類有兩個構(gòu)造函數(shù),這意味著您希望創(chuàng)建新實例Existing而不管已經(jīng)定義的對象A......。Z這不是枚舉背后的想法。

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

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


查看完整回答
反對 回復 2023-04-19
  • 3 回答
  • 0 關(guān)注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號