摘要:即不使用繼承方式,而將父類包含在子類中重寫只有當(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
摘要:本章中的大部分內(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è)余翻譯,不合理的地方,望指正,感激...
摘要:推薦序前言致謝第一章引言第二章創(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)建器 第...
摘要:類選擇器具有更高的專用性,所以將戰(zhàn)勝元素選擇器。個(gè)位在整個(gè)選擇器中每包含一個(gè)元素選擇器或偽元素就在該列中加分。選擇器六明顯地輸給了了五,其專用性值為和它在鏈中少了一個(gè)元素選擇器。當(dāng)有多個(gè)選擇器作用在一個(gè)元素上時(shí),哪個(gè)規(guī)則最終會(huì)應(yīng)用到元素上? 其實(shí)這是通過層疊機(jī)制來控制的,這也和樣式繼承(元素從其父元素那里獲得屬性值)有關(guān)。 元素的最終樣式可以在多個(gè)地方定義,它們以復(fù)雜的形式相互影響。這些復(fù)雜...
摘要:知道存在是很有用的,這樣當(dāng)你在別人的代碼中遇到它時(shí),你就知道它是什么了。如上面所示的示例所示,元素選擇器具有很低的特殊性。類選擇器具有更高特殊性,所以將戰(zhàn)勝元素選擇器。個(gè)位在整個(gè)選擇器中每包含一個(gè)元素選擇器或偽元素就在該列中加分。 在實(shí)際的工作中,我們可能還有些疑惑,當(dāng)有多個(gè)選擇器作用在一個(gè)元素上時(shí),哪個(gè)規(guī)則最終會(huì)應(yīng)用到元素上?其實(shí)這是通過層疊機(jī)制來控制的,這也和樣式繼承(元素從其父元...
摘要:來源前條來源一書英文版已經(jīng)出版,這本書的第二版想必很多人都讀過,號稱四大名著之一,不過第二版年出版,到現(xiàn)在已經(jīng)將近年的時(shí)間,但隨著,,,甚至的發(fā)布,語言發(fā)生了深刻的變化。譯者在這里第一時(shí)間翻譯成中文版。供大家學(xué)習(xí)分享之用。 來源:sjsdfg/effective-java-3rd-chinese前 51 條來源:Effective Java, Third Edition 《Effec...
閱讀 2846·2021-11-19 09:40
閱讀 3704·2021-11-15 18:10
閱讀 3287·2021-11-11 16:55
閱讀 1238·2021-09-28 09:36
閱讀 1660·2021-09-22 15:52
閱讀 3374·2019-08-30 14:06
閱讀 1168·2019-08-29 13:29
閱讀 2315·2019-08-26 17:04