亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

復(fù)合優(yōu)先于繼承(重寫(xiě)equals方法引出的建議)

villainhr / 2362人閱讀

摘要:即不使用繼承方式,而將父類(lèi)包含在子類(lèi)中重寫(xiě)只有當(dāng)坐標(biāo)和顏色都相同才返回當(dāng)然,重寫(xiě)的時(shí)候一定記得重寫(xiě)重寫(xiě)重寫(xiě)參考文獻(xiàn)第二版第條覆蓋方法時(shí)請(qǐng)遵守通用約定

問(wèn)題復(fù)現(xiàn):
首先有一個(gè)Point類(lèi),重寫(xiě)了equals方法:

public class Point{
    private final int x;
    private final int y;
    public Point(x,y){
        this.x=x;
        this.y=y;
    }
    @Override public boolean queals(Object o){
        if(!(o instanceof Point){
            return false;
        }
        Point p = (Point)o;
        return p.x == x && p.y == y;
    }
}

另有一個(gè)擴(kuò)展類(lèi),ColorPoint繼承Point類(lèi)

public class ColorPoint{
    private final Color color;
    public ColorPoint(int x,int y,Color color){
        super(x,y);
        this.color=color;
    }
}

這時(shí)候比較兩個(gè)點(diǎn)的時(shí)候就有個(gè)問(wèn)題:

Point point = new Point(1, 2);
ColorPoint cPoint = new ColorPoint(1, 2, Color.RED);
System.out.println(point.equals(cPoint)); // true
System.out.println(cPoint.equals(point); // false

可以發(fā)現(xiàn)equals方法違背了對(duì)稱(chēng)性原則,原因是Point的equals方法在接收ColorPoint類(lèi)型的參數(shù)時(shí),會(huì)將其當(dāng)做Point進(jìn)行比較,忽略了顏色的判斷,認(rèn)定兩個(gè)類(lèi)是相等的。
對(duì)此我們做出一些修改:

此時(shí)可修改equals方法,加入對(duì)顏色的判斷:
if(!(o.instanceOf(Point))
    return false;
//if o is a normal point,ignore color
if(!(o.instanceOf(ColorPoint))
    return o.equals(this);
//if o is a colorPoint .do a full compation
return super.equals(o) && ((ColorPoint)o).equals(this.color);

這段代碼修復(fù)了違背對(duì)稱(chēng)性的錯(cuò)誤,但兩個(gè)以上的點(diǎn)會(huì)有錯(cuò)誤,比如 兩個(gè)ColorPoint和一個(gè)Point作比較,如下:

ColorPoint cPointRed = new ColorPoint(1, 2, Color.RED);
Point point = new Point(1, 2);
ColorPoint cPointBlue = new ColorPoint(1, 2, Color.BLUE);
System.out.println(cPointRed.equals(point)); // true
System.out.println(point.equals(cPointBlue)); // true
System.out.println(cPointRed.equals(cPointBlue)); // false

這樣又違背了傳遞性原則。這時(shí)候就有個(gè)建議:復(fù)合優(yōu)先于繼承。
即不使用繼承方式,而將"父類(lèi)"包含在"子類(lèi)"中

public class ColorPoint{
    private final Point point;
    private final Color color;
    public ColorPoint(int x,int y,Color color){
        point.x = x;
        point.x = x
        this.color = color;
    }
    public Point getPoint(){
        return this.point;
    }
    //重寫(xiě)equals
    @Override public boolean equals(Object o){
        if(!(o instanceof ColorPoint){
            return false;
        }
        ColorPoint cp = (ColorPoint)o;
        //只有當(dāng)坐標(biāo)和顏色都相同才返回true;
        return cp.point.equals(this.point) && cp.Color.equals(color);
    }
}

當(dāng)然,重寫(xiě)equals的時(shí)候一定記得重寫(xiě)hashCode~重寫(xiě)hashCode~重寫(xiě)hashCode~~de~de~de~

參考文獻(xiàn):《Effective Java》第二版 第8條 “覆蓋equals方法時(shí)請(qǐng)遵守通用約定”

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/76881.html

相關(guān)文章

  • Effective Java 第三版 全文翻譯

    摘要:本章中的大部分內(nèi)容適用于構(gòu)造函數(shù)和方法。第項(xiàng)其他方法優(yōu)先于序列化第項(xiàng)謹(jǐn)慎地實(shí)現(xiàn)接口第項(xiàng)考慮使用自定義的序列化形式第項(xiàng)保護(hù)性地編寫(xiě)方法第項(xiàng)對(duì)于實(shí)例控制,枚舉類(lèi)型優(yōu)先于第項(xiàng)考慮用序列化代理代替序列化實(shí)例附錄與第版中項(xiàng)目的對(duì)應(yīng)關(guān)系參考文獻(xiàn) effective-java-third-edition 介紹 Effective Java 第三版全文翻譯,純屬個(gè)人業(yè)余翻譯,不合理的地方,望指正,感激...

    galois 評(píng)論0 收藏0
  • Effective Java 3rd.Edition 翻譯

    摘要:推薦序前言致謝第一章引言第二章創(chuàng)建和銷(xiāo)毀對(duì)象第項(xiàng)用靜態(tài)工廠(chǎng)方法代替構(gòu)造器第項(xiàng)遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮使用構(gòu)建器第項(xiàng)用私有構(gòu)造器或者枚舉類(lèi)型強(qiáng)化屬性第項(xiàng)通過(guò)私有構(gòu)造器強(qiáng)化不可實(shí)例化的能力第項(xiàng)優(yōu)先考慮依賴(lài)注入來(lái)引用資源第項(xiàng)避免創(chuàng)建不必要的對(duì)象 推薦序 前言 致謝 第一章 引言 第二章 創(chuàng)建和銷(xiāo)毀對(duì)象 第1項(xiàng):用靜態(tài)工廠(chǎng)方法代替構(gòu)造器 第2項(xiàng):遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮使用構(gòu)建器 第...

    KoreyLee 評(píng)論0 收藏0
  • CSS學(xué)習(xí)摘要-層疊和繼承

    摘要:類(lèi)選擇器具有更高的專(zhuān)用性,所以將戰(zhàn)勝元素選擇器。個(gè)位在整個(gè)選擇器中每包含一個(gè)元素選擇器或偽元素就在該列中加分。選擇器六明顯地輸給了了五,其專(zhuān)用性值為和它在鏈中少了一個(gè)元素選擇器。當(dāng)有多個(gè)選擇器作用在一個(gè)元素上時(shí),哪個(gè)規(guī)則最終會(huì)應(yīng)用到元素上? 其實(shí)這是通過(guò)層疊機(jī)制來(lái)控制的,這也和樣式繼承(元素從其父元素那里獲得屬性值)有關(guān)。 元素的最終樣式可以在多個(gè)地方定義,它們以復(fù)雜的形式相互影響。這些復(fù)雜...

    mating 評(píng)論0 收藏0
  • 不知道層疊,別說(shuō)你懂CSS

    摘要:知道存在是很有用的,這樣當(dāng)你在別人的代碼中遇到它時(shí),你就知道它是什么了。如上面所示的示例所示,元素選擇器具有很低的特殊性。類(lèi)選擇器具有更高特殊性,所以將戰(zhàn)勝元素選擇器。個(gè)位在整個(gè)選擇器中每包含一個(gè)元素選擇器或偽元素就在該列中加分。 在實(shí)際的工作中,我們可能還有些疑惑,當(dāng)有多個(gè)選擇器作用在一個(gè)元素上時(shí),哪個(gè)規(guī)則最終會(huì)應(yīng)用到元素上?其實(shí)這是通過(guò)層疊機(jī)制來(lái)控制的,這也和樣式繼承(元素從其父元...

    izhuhaodev 評(píng)論0 收藏0
  • Java 高效編程(Effective Java)中文第三版

    摘要:來(lái)源前條來(lái)源一書(shū)英文版已經(jīng)出版,這本書(shū)的第二版想必很多人都讀過(guò),號(hào)稱(chēng)四大名著之一,不過(guò)第二版年出版,到現(xiàn)在已經(jīng)將近年的時(shí)間,但隨著,,,甚至的發(fā)布,語(yǔ)言發(fā)生了深刻的變化。譯者在這里第一時(shí)間翻譯成中文版。供大家學(xué)習(xí)分享之用。 來(lái)源:sjsdfg/effective-java-3rd-chinese前 51 條來(lái)源:Effective Java, Third Edition 《Effec...

    ysl_unh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<