国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

villainhr / 2315人閱讀

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

問題復(fù)現(xiàn):
首先有一個(gè)Point類,重寫了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ò)展類,ColorPoint繼承Point類

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è)問題:

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方法違背了對稱性原則,原因是Point的equals方法在接收ColorPoint類型的參數(shù)時(shí),會(huì)將其當(dāng)做Point進(jìn)行比較,忽略了顏色的判斷,認(rèn)定兩個(gè)類是相等的。
對此我們做出一些修改:

此時(shí)可修改equals方法,加入對顏色的判斷:
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ù)了違背對稱性的錯(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)先于繼承
即不使用繼承方式,而將"父類"包含在"子類"中

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;
    }
    //重寫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)然,重寫equals的時(shí)候一定記得重寫hashCode~重寫hashCode~重寫hashCode~~de~de~de~

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

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/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àng)對于實(shí)例控制,枚舉類型優(yōu)先于第項(xiàng)考慮用序列化代理代替序列化實(shí)例附錄與第版中項(xiàng)目的對應(yīng)關(guān)系參考文獻(xiàn) effective-java-third-edition 介紹 Effective Java 第三版全文翻譯,純屬個(gè)人業(yè)余翻譯,不合理的地方,望指正,感激...

    galois 評論0 收藏0
  • Effective Java 3rd.Edition 翻譯

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

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

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

    mating 評論0 收藏0
  • 不知道層疊,別說你懂CSS

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

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

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

    ysl_unh 評論0 收藏0

發(fā)表評論

0條評論

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