3 回答

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果將其分配給局部變量,則唯一可以修改的就是為此變量分配另一個(gè)枚舉。這不會(huì)更改枚舉本身,因?yàn)槟桓淖兞恳玫膶?duì)象。
似乎枚舉實(shí)際上是單例的,因此整個(gè)程序中每個(gè)枚舉只能有一個(gè)元素存在,這使==運(yùn)算符對(duì)枚舉合法。
因此,不存在性能問(wèn)題,并且您不能意外更改枚舉定義中的某些內(nèi)容。

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
它的代碼是本地的嗎?還是JVM /編譯器對(duì)它進(jìn)行了特殊處理,僅當(dāng)無(wú)法證明不會(huì)對(duì)其進(jìn)行修改時(shí)才從values()返回一個(gè)新實(shí)例。
1)否。或者至少在當(dāng)前的實(shí)現(xiàn)中沒(méi)有。有關(guān)證據(jù),請(qǐng)參見(jiàn)@lucasmo的答案。
2)AFAIK,不。
假設(shè)它可以做到這一點(diǎn)。但是,證明數(shù)組永遠(yuǎn)不會(huì)在本地修改對(duì)于JIT而言將是復(fù)雜且相對(duì)昂貴的。如果數(shù)組從調(diào)用的方法中“逸出” values()
,它將變得更加復(fù)雜和昂貴。
當(dāng)對(duì)所有Java代碼求平均值時(shí),這種(假設(shè)的)優(yōu)化可能不會(huì)奏效。
另一個(gè)問(wèn)題是這種(假設(shè)的)優(yōu)化可能會(huì)打開安全漏洞。
有趣的是,JLS似乎沒(méi)有指定values()
成員返回?cái)?shù)組副本。常識(shí)1說(shuō)它必須做...但是實(shí)際上并沒(méi)有指定。
1-如果values()
返回一個(gè)共享(可變)enum
值數(shù)組,這將是一個(gè)巨大的安全漏洞。
添加回答
舉報(bào)