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

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

等于并與 BigDecimal 進(jìn)行比較

等于并與 BigDecimal 進(jìn)行比較

12345678_0001 2023-08-04 14:50:32
我有一個類重寫hashCode() 和equals()- 方法。當(dāng)我處理時BigDecimal,我必須compareTo()使用Objects.equals():public class MyProduct extends Product{private BigDecimal price;@Overridepublic int hashCode() {    return Objects.hash(price);}@Overridepublic boolean equals(Object obj) {        if (this == obj) return true; // is this right or should this be deleted        if (obj == null || getClass() != obj.getClass()) return false;        final Product other = (Product) obj;        // is this right?        if (price == null ? (other.price != null) : price.compareTo(other.price) != 0) {            return false;        }        return super.equals(obj);    }}我有以下問題:if (this == obj) return true;我應(yīng)該從-method 中刪除該行嗎equals()?因為使用這一行,compareTo 不會被觸發(fā),并且可能會計算出錯誤的 equals(),對嗎?equals()方法可以改進(jìn)嗎?
查看完整描述

3 回答

?
有只小跳蛙

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

第一行只是一種優(yōu)化,旨在如果兩個引用都指向同一對象,則提前返回結(jié)果。


可以price為空嗎?我認(rèn)為是的,因為您正在實施中檢查它equals()。在這種情況下,您的代碼將無法工作,以防other.price萬一null。具體這里的代碼:


price.compareTo(other.price) != 0

會拋出一個NullPointerException.


你可以這樣修復(fù)它:


    @Override

    public boolean equals(Object obj) {


        if (this == obj) return true; // is this right or should this be deleted


        if (obj == null || getClass() != obj.getClass()) return false;


        final MyProduct other = (MyProduct) obj;


        // If you prefer, the below two can be replaced with a single condition

        // price != null ^ other.price != null

        // Credits to @Andreas

        if (price == null && other.price != null) {

            return false;

        }

        if (price != null && other.price == null) {

            return false;

        }

        if (other.price != null && price.compareTo(other.price) != 0) {

            return false;

        }


        return super.equals(obj);

    }

現(xiàn)在,您可能可以將其縮短,但我個人認(rèn)為這種方式最具可讀性。


無論如何,除非您真的非常關(guān)心自定義您的equals()實現(xiàn),否則我建議您使用 IDE 生成一個并堅持使用它。他們大多數(shù)時候都做得不錯,你不必?fù)?dān)心它會被破壞(盡管比較對BigDecimals他們來說可能很棘手,因為你不關(guān)心規(guī)模而只關(guān)心價值)。


查看完整回答
反對 回復(fù) 2023-08-04
?
忽然笑

TA貢獻(xiàn)1806條經(jīng)驗 獲得超5個贊

我編寫了一個 utitly 方法,可用于比較兩個 BigDecimals 而不會拋出 NPE:


// returns true, if val1 is the same as val2

// can this be improved ?

public static boolean isEqual(BigDecimal val1, BigDecimal val2) {

        return !((val1 != null ^ val2 != null) || (val2 != null && val1.compareTo(val2) != 0));

    }

這可以在 equals 方法中使用:


@Override

    public boolean equals(Object obj) {

        if (this == obj) return true;

        if (obj == null || getClass() != obj.getClass()) return false;

        final MyProduct other = (MyProduct) obj;


        if(!isEqual(price, other.price)) return false;


        return super.equals(obj);

    }


查看完整回答
反對 回復(fù) 2023-08-04
?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗 獲得超4個贊

我找到了最簡單的方法:


public static boolean isEqual(BigDecimal val1, BigDecimal val2) {

    return val1 != null ^ val2 != null && val2 != null && val1.compareTo(val2) != 0;

}

然后在 equals() 中使用它:


public boolean equals(Object obj) {

        if (this == obj) return true;

        if (obj == null || getClass() != obj.getClass()) return false;

        final MyProduct other = (MyProduct) obj;


        if(!isEqual(price, other.price)) return false;


        return super.equals(obj);

    }


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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