摘要:即不使用繼承方式,而將父類(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
摘要:本章中的大部分內(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è)余翻譯,不合理的地方,望指正,感激...
摘要:推薦序前言致謝第一章引言第二章創(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)建器 第...
摘要:類(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ù)雜...
摘要:知道存在是很有用的,這樣當(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)控制的,這也和樣式繼承(元素從其父元...
摘要:來(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...
閱讀 2910·2021-11-19 09:40
閱讀 3759·2021-11-15 18:10
閱讀 3374·2021-11-11 16:55
閱讀 1326·2021-09-28 09:36
閱讀 1723·2021-09-22 15:52
閱讀 3427·2019-08-30 14:06
閱讀 1221·2019-08-29 13:29
閱讀 2364·2019-08-26 17:04