国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

比較java枚舉成員使用equal還是==

2021-01-17 14:06 作者:JavaPub  | 我要投稿

閱讀大約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哥的知識(shí)清單

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


比較java枚舉成員使用equal還是==的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
茌平县| 澄城县| 天等县| 伊金霍洛旗| 泸溪县| 南郑县| 贵州省| 临夏市| 孟村| 巴东县| 柏乡县| 开阳县| 东乡族自治县| 桐梓县| 普格县| 肇东市| 洪泽县| 维西| 饶阳县| 冀州市| 浑源县| 文化| 天水市| 宜都市| 昌都县| 商都县| 洛川县| 鸡泽县| 赤水市| 巧家县| 汽车| 桐乡市| 南岸区| 九龙坡区| 宜宾县| 田东县| 荆州市| 德阳市| 贡觉县| 贺兰县| 邯郸市|