比較java枚舉成員使用equal還是==
閱讀大約3分鐘
再由一年就是2021年春節(jié)了,大家有沒(méi)有為新的一年立一個(gè) flag ,flag 這東西,實(shí)現(xiàn)是一方面,最重要的是一定要立?;厥祝覀円部梢钥纯次覀兊牧?flag 過(guò)程。
前言
問(wèn)題
答案
詳細(xì)探討
能在枚舉中使用 == 進(jìn)行判斷?
什么時(shí)候 == 和 equals 不一樣?
什么時(shí)候使用 == ?
前言
枚舉類(lèi)在 java 中使用頻率極高,這個(gè) equal 還是 == 問(wèn)題需要注意。這寫(xiě)個(gè)問(wèn)題就我們一年重視的,所謂基礎(chǔ)不牢,地動(dòng)山搖。
問(wèn)題
我知道Java枚舉會(huì)被編譯成一個(gè)包含私有構(gòu)造參數(shù)和一堆靜態(tài)方法的類(lèi),當(dāng)去比較兩個(gè)枚舉的時(shí)候,總是使用equals()方法,例如:
public?useEnums(SomeEnum?a)
{
????if(a.equals(SomeEnum.SOME_ENUM_VALUE))
????{
????????...
????}
????...
}
除此之外,我也可以使用 == 替代equals() 方法
public?useEnums2(SomeEnum?a)
{
????if(a?==?SomeEnum.SOME_ENUM_VALUE)
????{
????????...
????}
????...
}
答案
二者皆對(duì),如果你看過(guò)枚舉的源碼,你會(huì)發(fā)現(xiàn)在源碼中,equals也僅僅非常簡(jiǎn)單的 == 。 我使用 == ,因?yàn)闊o(wú)論如何,這個(gè)左值是可以為 null的
java.lang.Enum 中Equals 代碼:
public?final?boolean?equals(Object?other)?{
????return?this==other;
}
詳細(xì)探討
能在枚舉中使用 == 進(jìn)行判斷?
答案是肯定的,因?yàn)槊杜e有著嚴(yán)格的實(shí)例化控制,所以你可以用 == 去做比較符,這個(gè)用法,在官方文檔中也有明確的說(shuō)明。
JLS 8.9 Enums 一個(gè)枚舉類(lèi)型除了定義的那些枚舉常量外沒(méi)有其他實(shí)例了。 試圖明確地說(shuō)明一種枚舉類(lèi)型是會(huì)導(dǎo)致編譯期異常。在枚舉中final clone方法確保枚舉常量從不會(huì)被克隆,而且序列化機(jī)制會(huì)確保從不會(huì)因?yàn)榉葱蛄谢鴦?chuàng)造復(fù)制的實(shí)例。枚舉類(lèi)型的反射實(shí)例化也是被禁止的??傊陨蟽?nèi)容確保了除了定義的枚舉常量之外,沒(méi)有枚舉類(lèi)型實(shí)例。
因?yàn)槊總€(gè)枚舉常量只有一個(gè)實(shí)例,所以如果在比較兩個(gè)參考值,至少有一個(gè)涉及到枚舉常量時(shí),允許使用“==”代替equals()。(equals()方法在枚舉類(lèi)中是一個(gè)final方法,在參數(shù)和返回結(jié)果時(shí),很少調(diào)用父類(lèi)的equals()方法,因此是一種恒等的比較。)
什么時(shí)候 == 和 equals 不一樣?
As a reminder, it needs to be said that generally, == is NOT a viable alternative to equals. When it is, however (such as with enum), there are two important differences to consider: 通常來(lái)說(shuō) == 不是一個(gè) equals的一個(gè)備選方案,無(wú)論如何有2個(gè)重要的不同處需要考慮:
== 不會(huì)拋出 NullPointerException
enum?Color?{?BLACK,?WHITE?};
Color?nothing?=?null;
if?(nothing?==?Color.BLACK);??????//?runs?fine
if?(nothing.equals(Color.BLACK));?//?throws?NullPointerException
== 在編譯期檢測(cè)類(lèi)型兼容性
enum?Color?{?BLACK,?WHITE?};
enum?Chiral?{?LEFT,?RIGHT?};
if?(Color.BLACK.equals(Chiral.LEFT));?//?compiles?fine
if?(Color.BLACK?==?Chiral.LEFT);??????//?DOESN'T?COMPILE!!!?Incompatible?types!
什么時(shí)候使用 == ?
Bloch specifically mentions that immutable classes that have proper control over their instances can guarantee to their clients that == is usable. enum is specifically mentioned to exemplify. 具體來(lái)說(shuō),那些提供恰當(dāng)實(shí)例控制的不可變類(lèi)能夠保證 == 是可用的,枚舉剛好符合這個(gè)條件。
考慮靜態(tài)工廠方法代替構(gòu)造器 它使得不可變的類(lèi)可以確保不會(huì)存在兩個(gè)相等的實(shí)例,即當(dāng)且僅當(dāng)a==b的時(shí)候才有a.equals(b)為true。如果類(lèi)保證了這一點(diǎn),它的客戶(hù)端可以使用“==”操作符來(lái)代替equals(Object)方法,這樣可以提升性能。枚舉類(lèi)型保證了這一點(diǎn)
總而言之,在枚舉比較上使用 == , 因?yàn)椋?1. 能正常工作 2. 更快 3. 運(yùn)行時(shí)是安全的 4. 編譯期也是安全的
參考:http://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals

我是pub哥,下期見(jiàn)