最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Java中的繼承和組合的一個(gè)錯(cuò)誤使用的例子

 更新時(shí)間:2016年08月28日 18:45:13   投稿:mdxy-dxy  
這篇文章主要介紹了關(guān)于Java中的繼承和組合的一個(gè)錯(cuò)誤使用的例子,需要的朋友可以參考下

相信絕大多數(shù)人都比較熟悉Java中的「繼承」和「組合」這兩個(gè)東西,本篇文章就主要就這兩個(gè)話(huà)題談?wù)撘幌隆H绻夷承┑胤綄?xiě)的不對(duì),或者比較幼稚,論證不清晰,歡迎大家留言指正。

什么是「組合」和「繼承」

假設(shè)有2個(gè)class:AB:

  • 如果class A extends B 那么我們就說(shuō)A繼承B,A是子類(lèi),B是父類(lèi),這種情況就是繼承。
  • 如果A中有一個(gè)屬性的類(lèi)型為B,那么我們就說(shuō)這種情況就是組合。
分別在什么情況下使用

回想一些我們一般會(huì)在什么情況下考慮這兩個(gè)東西呢?我大致想了一下,往往會(huì)有如下的場(chǎng)景:

  • 公用代碼
  • 為了表明事物之間的「共性」或者說(shuō)僅僅為了「泛型」,抽取abstract class或者interface

我想來(lái)想去,好像真的只有這兩種情況了,但是這兩種情況有特別的有關(guān)聯(lián),比如說(shuō)公用代碼這個(gè)事情,其實(shí)abstract classinterface(Java 8中的default method)都可以達(dá)到。

好吧,說(shuō)了這么多屁話(huà),我就直接拋出我的觀點(diǎn)吧,歡迎拍磚:

  • 如果你僅僅想公用代碼,而且使用這些公用代碼的class或者method并沒(méi)有很明顯的聯(lián)系,那么就請(qǐng)使用組合。
  • 如果若干個(gè)class或者其method有比較明顯的聯(lián)系,那么請(qǐng)抽取一個(gè)abstract class或者interface
  • 慎用「屬性繼承」的特性,建議子類(lèi)明確復(fù)寫(xiě)所需要的父類(lèi)的屬性。這一點(diǎn)尤為重要,后續(xù)會(huì)有一個(gè)例子來(lái)說(shuō)明這種情況的不利面。
反面教材

比較常見(jiàn)的一個(gè)例子:我們?cè)趯?shí)際的項(xiàng)目中,往往會(huì)定義好的的POJO或者說(shuō)model,而這些model往往都會(huì)有一些名詞和類(lèi)型相同的屬性,比如:

// db table primary key
private int id;

很常見(jiàn)吧,但是我在實(shí)際工作中遇到過(guò)不少的同事,系統(tǒng)定義一個(gè)名稱(chēng)可能為BaseModel或者RootModel的類(lèi),把上面的屬性id放在里面,然后整個(gè)項(xiàng)目中所有的model都繼承這個(gè)BaseModdel類(lèi)。不知道你們是否遇到過(guò)這樣的同事?你們覺(jué)的這樣寫(xiě)能有什么好處和壞處呢?

先說(shuō)好處吧,如果非要說(shuō)能帶來(lái)什么好處的話(huà),除了少敲幾下鍵盤(pán),在子類(lèi)中少些了這些屬性以外,沒(méi)看見(jiàn)有啥實(shí)質(zhì)性的好處。但是卻為項(xiàng)目后續(xù)的維護(hù)帶來(lái)了很麻煩的事情。

然后說(shuō)這種寫(xiě)法的潛在問(wèn)題吧:

某一天,因?yàn)橐恍┰?,你想找子?lèi)A(繼承了BaseModel)中的屬性id在項(xiàng)目中的哪些地方使用

機(jī)智的你熟練的使用起了IDE中的find usages,然后你就會(huì)發(fā)現(xiàn)你找到的使用位置非常的多,而且好多壓根不是你關(guān)心的。但是沒(méi)辦法,你也搜索到了其他的繼承了BaseModel的類(lèi)的屬性id的使用位置。如果項(xiàng)目不大,可能搜索到的熟練比較少,如果項(xiàng)目大了一點(diǎn)呢?當(dāng)搜索熟練超過(guò)了50處,你接下來(lái)會(huì)怎么做?

  • 一個(gè)一個(gè)看搜索出來(lái)的代碼,看了十幾二十個(gè)開(kāi)始噴,然后繼續(xù)一個(gè)一個(gè)往下找?
  • 直接開(kāi)始噴,然后在一個(gè)一個(gè)看搜索出來(lái)的代碼?

如何避免出現(xiàn)這種情況呢,那就是不要使用類(lèi)似這種BaseModel的方式來(lái)使用屬性繼承。當(dāng)然為了嚴(yán)謹(jǐn)期間,我還是需要詳細(xì)說(shuō)一下這個(gè)意思,我并沒(méi)有完全反對(duì)屬性繼承哦,明確一下:

我反對(duì)的是整個(gè)項(xiàng)目所有的model繼承一個(gè)BaseModel,然后把公用屬性放在BaseModel中

的這種想法,注意是整個(gè)項(xiàng)目的

后記
上面的反面教材的例子我個(gè)人經(jīng)常會(huì)碰見(jiàn),所以單獨(dú)拿出來(lái)說(shuō)一下,我不確定在大家的項(xiàng)目中是否出現(xiàn)過(guò)這種情況。反正我已經(jīng)被同事的這種寫(xiě)法坑過(guò)好多回了。

至于「組合」和「繼承」其他相關(guān)的常見(jiàn)錯(cuò)誤,我暫時(shí)還沒(méi)想好(至少我覺(jué)的應(yīng)該沒(méi)人會(huì)犯),如果我后續(xù)想清楚了,或者讀者朋友們有其他的建議希望可以留言交流一下哈。

相關(guān)文章

  • springmvc+spring+mybatis實(shí)現(xiàn)用戶(hù)登錄功能(下)

    springmvc+spring+mybatis實(shí)現(xiàn)用戶(hù)登錄功能(下)

    這篇文章主要為大家詳細(xì)介紹了springmvc+spring+mybatis實(shí)現(xiàn)用戶(hù)登錄功能的第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Springboot打包部署修改配置文件的方法

    Springboot打包部署修改配置文件的方法

    這篇文章主要介紹了Springboot打包部署修改配置文件的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法

    Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法

    任務(wù)超時(shí)處理是比較常見(jiàn)的需求,Java中對(duì)超時(shí)任務(wù)的處理有兩種方式,在文中給大家詳細(xì)介紹,本文重點(diǎn)給大家介紹Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法,需要的朋友可以參考下
    2019-06-06
  • Java 程序設(shè)計(jì)總復(fù)習(xí)題(java基礎(chǔ)代碼)

    Java 程序設(shè)計(jì)總復(fù)習(xí)題(java基礎(chǔ)代碼)

    這篇文章主要介紹了Java 程序設(shè)計(jì)總復(fù)習(xí)題,主要是java基礎(chǔ)代碼,方便學(xué)習(xí)java的同學(xué)
    2021-05-05
  • java之CSV大批量數(shù)據(jù)入庫(kù)的實(shí)現(xiàn)

    java之CSV大批量數(shù)據(jù)入庫(kù)的實(shí)現(xiàn)

    本文主要介紹了java之CSV大批量數(shù)據(jù)入庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java自動(dòng)讀取指定文件夾下所有文件的方法

    Java自動(dòng)讀取指定文件夾下所有文件的方法

    這篇文章主要為大家詳細(xì)介紹了Java自動(dòng)讀取指定文件夾下所有文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 圖文詳解mybatis+postgresql平臺(tái)搭建步驟

    圖文詳解mybatis+postgresql平臺(tái)搭建步驟

    從頭開(kāi)始搭建一個(gè)mybatis+postgresql平臺(tái),這篇文章主要介紹了圖文詳解mybatis+postgresql平臺(tái)搭建步驟,感興趣的小伙伴們可以參考一下
    2016-07-07
  • spring boot整合Swagger2的示例代碼

    spring boot整合Swagger2的示例代碼

    Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化RESTful風(fēng)格的 Web 服務(wù)。這篇文章主要介紹了spring boot整合Swagger2,需要的朋友可以參考下
    2017-04-04
  • 入門(mén)java的第一步HelloWorld

    入門(mén)java的第一步HelloWorld

    這篇文章主要介紹了入門(mén)java的第一步-Hello,World,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的java初步學(xué)習(xí)具有一定的學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java List中數(shù)據(jù)的去重

    Java List中數(shù)據(jù)的去重

    今天小編就為大家分享一篇關(guān)于Java List中數(shù)據(jù)的去重,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01

最新評(píng)論

余姚市| 开封市| 珲春市| 茶陵县| 琼海市| 清远市| 湾仔区| 唐山市| 余江县| 铜鼓县| 铜山县| 临猗县| 额敏县| 武鸣县| 遵义市| 西峡县| 包头市| 改则县| 牟定县| 夏津县| 宿州市| 喀喇| 浏阳市| 靖江市| 孟连| 青川县| 保德县| 定日县| 新巴尔虎右旗| 布尔津县| 无极县| 望江县| 武定县| 西城区| 宜兴市| 饶平县| 张掖市| 五台县| 新昌县| 宜昌市| 连州市|