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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么枚舉的構(gòu)造函數(shù)不能訪問靜態(tài)字段?

為什么枚舉的構(gòu)造函數(shù)不能訪問靜態(tài)字段?

慕無忌1623718 2019-10-28 10:48:24
為什么枚舉的構(gòu)造函數(shù)不能訪問靜態(tài)字段和方法?這對(duì)于一個(gè)類是完全有效的,但對(duì)于枚舉是不允許的。我正在嘗試將枚舉實(shí)例存儲(chǔ)在靜態(tài)Map中??紤]下面的示例代碼,它允許通過abbreivation查找:public enum Day {    Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");    private final String abbreviation;    private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();    private Day(String abbreviation) {        this.abbreviation = abbreviation;        ABBREV_MAP.put(abbreviation, this);  // Not valid    }    public String getAbbreviation() {        return abbreviation;    }    public static Day getByAbbreviation(String abbreviation) {        return ABBREV_MAP.get(abbreviation);    }}這將不起作用,因?yàn)槊杜e不允許在其構(gòu)造函數(shù)中使用靜態(tài)引用。但是,它只是在實(shí)現(xiàn)為類的情況下才起作用:public static final Day SUNDAY = new Day("Sunday", "Sun");private Day(String name, String abbreviation) {    this.name = name;    this.abbreviation = abbreviation;    ABBREV_MAP.put(abbreviation, this);  // Valid}
查看完整描述

3 回答

?
人到中年有點(diǎn)甜

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊

因?yàn)樗徐o態(tài)字段(包括表示枚舉值的靜態(tài)字段)都是按文本順序初始化的,而枚舉值始終位于其他字段之前,所以在初始化靜態(tài)字段之前會(huì)調(diào)用構(gòu)造函數(shù)。請(qǐng)注意,在您的類示例中,您沒有顯示ABBREV_MAP的初始化位置-如果 SUNDAY 之后,則在初始化類時(shí)會(huì)出現(xiàn)異常。

是的,這有點(diǎn)痛苦,可能設(shè)計(jì)得更好。

但是,根據(jù)我的經(jīng)驗(yàn),通常的答案是static {}在所有靜態(tài)初始化程序的末尾添加一個(gè)塊,然后在其中進(jìn)行所有靜態(tài)初始化,EnumSet.allOf 以獲取所有值。


查看完整回答
反對(duì) 回復(fù) 2019-10-28
?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

引用JLS,“枚舉主體聲明”部分:


沒有此規(guī)則,由于枚舉類型固有的初始化循環(huán)性,顯然合理的代碼將在運(yùn)行時(shí)失敗。(在具有“自類型”靜態(tài)字段的任何類中都存在圓度。)這是將失敗的那種代碼的示例:


enum Color {

    RED, GREEN, BLUE;

    static final Map<String,Color> colorMap = new HashMap<String,Color>();


    Color() {

       colorMap.put(toString(), this);

    }

}

此枚舉類型的靜態(tài)初始化將引發(fā)NullPointerException,因?yàn)樵谶\(yùn)行枚舉常量的構(gòu)造函數(shù)時(shí),靜態(tài)變量colorMap未初始化。上面的限制確保了此類代碼不會(huì)編譯。


請(qǐng)注意,可以輕松地將示例重構(gòu)為正常工作:


enum Color {

    RED, GREEN, BLUE;

    static final Map<String,Color> colorMap = new HashMap<String,Color>();


    static {

        for (Color c : Color.values())

            colorMap.put(c.toString(), c);

    }

}

重構(gòu)版本顯然是正確的,因?yàn)殪o態(tài)初始化是自上而下進(jìn)行的。


查看完整回答
反對(duì) 回復(fù) 2019-10-28
?
慕桂英3389331

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊

也許這就是你想要的


public enum Day {

    Sunday("Sun"), 

    Monday("Mon"), 

    Tuesday("Tue"), 

    Wednesday("Wed"), 

    Thursday("Thu"), 

    Friday("Fri"), 

    Saturday("Sat");


    private static final Map<String, Day> ELEMENTS;


    static {

        Map<String, Day> elements = new HashMap<String, Day>();

        for (Day value : values()) {

            elements.put(value.element(), value);

        }

        ELEMENTS = Collections.unmodifiableMap(elements);

    }


    private final String abbr;


    Day(String abbr) {

        this.abbr = abbr;

    }


    public String element() {

        return this.abbr;

    }


    public static Day elementOf(String abbr) {

        return ELEMENTS.get(abbr);

    }

}


查看完整回答
反對(duì) 回復(fù) 2019-10-28
  • 3 回答
  • 0 關(guān)注
  • 686 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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