国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從Scala看canEqual與正確的的equals實現

開發 后端
Java中的Equals實現,在Effective Java的描述中,是無法保證其完全正確的。不過根據Scala創始人的一篇文章,canEqual方法是可以解決這個問題的。這在Scala語言中得到了實現。

Equals實現在Java中有著很多的問題(詳見《所有的Equals方法實現都是錯誤的》),不過這些問題并非令人完全喪氣。下面通過Scala作者的一篇文章中探討equals實現以及canEqual的使用。

在 Effective Java 中,Joshua Bloch 提到,如果一個可實例化的類定義了 equals 方法。另有一個子類繼承它,也定義了額外一些屬性,并且 equals 方法中需要使用這些新定義的屬性進行相等性判斷。那么就不可能保證 equals 語義的正確。

相信看過 Effective Java 的人當年讀到這里時都會覺得喪氣。就好像完美的世界突然有了一個無法縫合的裂口。先不要完全喪失興趣,看看下面的文章:

How to Write an Equality Method in Java (51CTO曾翻譯此文為《所有的Equals方法實現都是錯誤的》)

這篇主要由 Scala 的作者 Martin Odersky 執筆的文章中提到了一個有意思的方法。每個類在定義 equals 時,首先先判斷 canEqual 能不能校驗通過。canEqual 的作用就是限定:只有當被比較的對象是當前對象的子類或同類時才能通過。

  1. class Point {  
  2.  
  3.   // 屬性定義  
  4.   ...  
  5.  
  6.   boolean canEqual(Object other) {  
  7.     return (other instanceof Point);  
  8.   }  
  9.     
  10.   @Override boolean equals(Object other) {  
  11.     if (other instanceof Point) {  
  12.       Point that = (Point) other;  
  13.       if (that.canEqual(this) && ...) return true 
  14.     }  
  15.     return false;   
  16.   }  
  17.     
  18. }  
  19.  

子類的定義與父類相似。

也就是說,在這樣的約定下,如果拿一個父類實例和子類實例用 equals 比較肯定會返回 false。關于這篇文章,有興趣的話可以看看相應的討論。

討論主要集中在文章里的方法是否違背了 Liskov Substitution Principle (LSP),以及如果違背了那么這個問題有多嚴重上。看過下面的分析后大家也許會覺得這種討論沒有太多意義。

我個人推薦這種 canEqual 方法。我說“方法”而不說“解決方案”是因為我覺得 Odersky 所描述的 equals 實現與 Bloch 本來所期望的 equals 邏輯模型并不一致。想像 Odersky 文章中的例子。有一個類 - 點(Point),及其子類 - 有色點(ColoredPoint)。如果一個有色點實例,其坐標與一個普遍點坐標一樣,又因為有色點“是”點,所以這兩點應該“相等”。大家都期望這樣一個結論是成立的,所以當看到 Bloch 的結論時會覺得面向對象有其固有的自相矛盾之處。但是這樣一個結論卻并不是天然成立的。一個沒有顏色的點與一個有顏色的點能相等嗎?有人會說,如果 ColoredPoint 里面的 color 屬性是一個枚舉,而且那個子類被實例化成 Color.UNSPECIFIED(未指定的顏色),那么這兩個點邏輯上就應該相等了吧。我認為,如果 ColoredPoint.color 可以有這樣一個屬性值的話,那么 Point 類就應該被定義為抽象類。Point 類此時實例化沒有意義。換句話說,如果 Point 類可以實例化,且其子類 ColoredPoint 也可以有一個“未指定的顏色”,而且兩者都定義了 equals,那么出現這種情況我認為是設計失敗。

再看看 LSP。LSP 說,任何可以使用父類實例的地方都可以使用子類實例代替。這里并不違反 LSP,因為如果一個地方可以這樣調用:

  1. Point p = new Point();  
  2. if (p.equals(...)) {  
  3.   ...  
  4. }  
  5.  

那么使用子類一樣可以調用 equals。只不過,equals 在傳入相同的參數時返回的結果可能會不一樣。但是 LSP 并不約束必須返回一樣的結果。而這正是多態的特征。

回到 Bloch 的論點上。現在贊同我的人可能會覺得 Bloch 的論點有問題。其實他說得很嚴謹,沒有一絲問題。他的論點的前提是:可實例化的父類。也就是說無法針對非抽象類寫出滿足大家傳統期望的子類。只不過,另人失望地,他在提出這個結論后沒有給出對應的方法。相對來說,Odersky 理清了 Bloch 的邏輯模型。所以,在 Odersky 所發明的 Scala 中,canEqual 這個方法也被作為官方推薦的 equals實現方法。

【編輯推薦】

  1. Java:所有的equals方法實現都是錯誤的?
  2. Java語言中深入研究Java equals方法
  3. Java是平臺而非產品:可添加型概念需改變
  4. Java中的堆內存與棧內存分配淺析
  5. Scala編程語言
責任編輯:yangsai 來源: JavaEye博客
相關推薦

2009-09-22 09:42:24

Scala的核心

2009-12-09 09:15:47

從Java走進ScalTwitter API

2021-06-26 07:04:24

Epoll服務器機制

2009-06-15 15:33:13

ScalaTwitter

2009-02-04 17:32:03

ibmdwJavaScala

2021-05-06 10:33:30

C++Napiv8

2017-04-05 20:00:32

ChromeObjectJS代碼

2024-03-07 13:30:44

Java對象true

2009-06-16 17:54:38

Scala類語法語義

2014-04-22 09:51:24

LongAdderAtomicLong

2021-07-07 23:38:05

內核IOLinux

2020-03-09 15:40:27

RSACDevSecOps懸鏡安全

2009-04-28 18:32:54

2009-07-06 15:55:50

2013-08-27 18:31:33

恒天然SPC軟件

2009-08-21 16:17:25

ScalaTwitter API

2009-09-28 11:01:39

從Java走進Scal

2009-08-13 10:35:05

Scala數組排序

2021-06-18 06:02:24

內核文件傳遞

2009-06-30 09:31:53

點贊
收藏

51CTO技術棧公眾號

深夜福利视频一区| 成人国产在线视频| 久久久人人爽| 高清国语自产在线观看| 亚洲午夜精品| 99久久精品国产精品久久| 久久久久se| 欧美a一区二区| www插插插无码免费视频网站| 天堂电影一区| 久久久亚洲天堂| 成人xxxxx色| 亚洲欧洲日韩| 91久久伊人青青碰碰婷婷| 色97色成人| 国产一区免费在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 精品国产乱码久久久久久郑州公司 | 超碰在线免费播放| 国产乱码精品一区二区三| 91在线观看免费高清| 成人免费观看在线观看| 亚洲午夜女主播在线直播| 欧洲一级在线观看| 亚洲国产三级| 国产福利成人在线| 天堂va欧美ⅴa亚洲va一国产| 日韩欧美一级二级三级| 国产对白叫床清晰在线播放| 一区在线观看视频| 日韩精品一区二区三区色欲av| 国产在线国偷精品免费看| 日韩在线观看电影完整版高清免费| 1000部精品久久久久久久久| 岛国一区二区三区高清视频| 五月开心六月丁香综合色啪| 国产精品露脸av在线| 色综合www| 欧美一区二区色| 伊人久久大香线蕉无限次| 午夜精品久久久久久久白皮肤| 激情中国色综合| 超碰97人人做人人爱少妇| 91精品麻豆| 久久久久久国产精品久久| 国产高清亚洲| 91精品国产精品| 欧美日产在线观看| 婷婷在线视频| 精品粉嫩超白一线天av| 国产911在线观看| 伊人精品成人久久综合软件| 国产精品久久不能| 精品国产日韩欧美| 欧美精品日韩一本| 免费国产成人av| 国产尤物av一区二区三区| 国产成人无码精品久久久性色| 欧美黄色免费| 亚洲伊人久久综合| 欧美h版在线观看| 国产亚洲一二三区| 久久久久日韩精品久久久男男| 久久久久久久久久久久久国产精品 | 麻豆av在线免费看| 国产欧美一区在线| 亚洲 日韩 国产第一区| 91日韩在线专区| 国产又黄又大久久| 亚洲一区二区精品在线| 麻豆视频观看网址久久| 日韩视频在线免费播放| 99久久伊人久久99| 日韩日韩日韩日韩| 欧美高清视频在线高清观看mv色露露十八 | av免费网站在线观看| 国产网站欧美日韩免费精品在线观看| 东京一区二区| 91精品国产91久久久久久吃药| 色婷婷综合网| 视频一区不卡| 久久久久久97三级| 黄色av免费在线观看| 亚洲另类图片色| 久9久9色综合| 亚洲国产日韩美| 国产精品久久久久影院老司| 福利视频在线导航| 自拍偷拍亚洲精品| 久久亚洲在线| 毛片av在线播放| 亚洲成人福利片| 亚洲www免费| 91亚洲va在线va天堂va国 | 国内精品400部情侣激情| 欧美fxxxxxx另类| 岛国大片在线播放| 亚洲一区av在线| 亚洲成人不卡| 99久久精品免费看国产四区| 成人精品电影在线观看| 蝌蚪视频在线播放| xxx欧美精品| 一区二区三区国产在线| 日韩视频第二页| 欧美性猛交xxxx黑人猛交| 看黄在线观看| 欧美专区中文字幕| 国产在线视视频有精品| 一二三四中文在线| 亚洲人成自拍网站| 欧美日本不卡| 天天色综合6| 日韩高清欧美高清| 欧美丰满老妇| 精品www久久久久奶水| 6080日韩午夜伦伦午夜伦| 久久精品国产亚洲5555| 亚洲福利av在线| 精品国产成人av| 亚洲欧美日本国产| 婷婷视频在线播放| 色94色欧美sute亚洲线路一ni| 国产精品17p| 欧美国产日韩激情| 日韩视频免费观看高清完整版| 精品在线99| 日日碰狠狠躁久久躁婷婷| 精品福利二区三区| 亚洲欧洲午夜| 在线视频网站| 91精品国产99| 欧美经典一区二区三区| 在线成人视屏| 亚洲国产欧美日韩| 91麻豆精品国产91久久久使用方法| 久久亚洲成人| 992tv在线观看| 欧美激情精品久久久久| 国产jizzjizz一区二区| 国产在线88av| 图片区小说区区亚洲五月| 欧美色网一区二区| 亚洲电影影音先锋| 在线播放色视频| 国产精品激情av在线播放| 欧美韩国一区二区| 青青在线精品| 国产午夜福利100集发布| 国产性色av一区二区| 国产在线精品一区二区不卡了| 在线三级中文| 欧洲视频一区二区三区| 欧美视频一区二区三区四区| 欧美在线黄色| 欧美偷拍视频| 91亚洲国产成人久久精品网站| 亚洲一级在线观看| 911精品美国片911久久久 | 天天爽夜夜爽一区二区三区| 色偷偷88888欧美精品久久久 | 亚洲综合男人的天堂| 动漫视频在线一区| 天天视频天天爽| 国外成人免费在线播放 | 黑人中文字幕一区二区三区| 精品久久久久久久久国产字幕 | 舔着乳尖日韩一区| 欧美hd在线| 国产理论电影在线观看| 国产欧美一区二区视频| 5月丁香婷婷综合| 麻豆freexxxx性91精品| а√在线中文在线新版| 97视频在线免费| 久久免费国产视频| 欧美日韩国产区| 在线亚洲成人| 亚洲性色av| 亚洲男人天堂色| 成人a级免费视频| 欧美一区二区三区婷婷月色| 国产专区欧美精品| 91综合久久爱com| 在线观看视频你懂的| 国产精品美女黄网| 亚洲精品黄网在线观看| 9色porny自拍视频一区二区| 天天躁日日躁狠狠躁欧美巨大小说| 中文字幕在线二区| 日韩精品极品视频在线观看免费| 亚洲欧美一区二区精品久久久| 国产无人区一区二区三区| 久久精品影视| 亚洲一区资源| 国产午夜电影| 日韩精品久久久免费观看| 久久精品男人天堂| 色哟哟日韩精品| 激情五月婷婷综合网|