欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

回想一些我們一般會在什么情況下考慮這兩個東西呢?我大致想了一下,往往會有如下的場景:

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

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

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

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

比較常見的一個例子:我們在實(shí)際的項(xiàng)目中,往往會定義好的的POJO或者說model,而這些model往往都會有一些名詞和類型相同的屬性,比如:

// db table primary key
private int id;

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

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

然后說這種寫法的潛在問題吧:

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

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

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

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

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

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

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

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

相關(guān)文章

  • 詳解spring面向切面aop攔截器

    詳解spring面向切面aop攔截器

    spring中有很多概念和名詞,比如過濾器、攔截器、aop等。這篇文章主要介紹了詳解spring面向切面aop攔截器,有興趣的可以了解一下。
    2017-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之最小堆和最大堆的原理及實(shí)現(xiàn)詳解

    Java數(shù)據(jù)結(jié)構(gòu)之最小堆和最大堆的原理及實(shí)現(xiàn)詳解

    在計(jì)算機(jī)科學(xué)中,堆(heap)?的實(shí)現(xiàn)是一種基于樹的特殊的數(shù)據(jù)結(jié)構(gòu),它可以在數(shù)組上構(gòu)建出樹的結(jié)構(gòu)體,并滿足堆的屬性。本文就來和大家詳細(xì)聊聊Java數(shù)據(jù)結(jié)構(gòu)中的堆,感興趣的可以了解一下
    2022-09-09
  • 利用Java編寫一個Java虛擬機(jī)

    利用Java編寫一個Java虛擬機(jī)

    這篇文章主要為大家詳細(xì)介紹了如何使用 Java17 編寫的 Java 虛擬機(jī),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解下
    2023-07-07
  • 全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin選型對比

    全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin選型對比

    這篇文章主要為大家介紹了全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin實(shí)現(xiàn)的選型對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Spring Boot整合FTPClient線程池的實(shí)現(xiàn)示例

    Spring Boot整合FTPClient線程池的實(shí)現(xiàn)示例

    這篇文章主要介紹了Spring Boot整合FTPClient線程池的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java中Date和LocalDate區(qū)別與介紹

    Java中Date和LocalDate區(qū)別與介紹

    本文主要介紹了Java中Date和LocalDate區(qū)別與介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 通過實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法

    通過實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法

    這篇文章主要介紹了通過實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java Stream流知識總結(jié)

    Java Stream流知識總結(jié)

    這篇文章主要介紹了Java Stream流的相關(guān)知識,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 詳解Java如何創(chuàng)建Annotation

    詳解Java如何創(chuàng)建Annotation

    在本文中,我們將介紹注解的基礎(chǔ)知識,包括注解是什么,它們?nèi)绾卧谑纠惺褂?,以及如何處理它們。下面和小編一起來學(xué)習(xí)吧
    2019-05-05
  • java中的this引用及對象構(gòu)造初始化

    java中的this引用及對象構(gòu)造初始化

    這篇文章主要介紹了java中的this引用及對象構(gòu)造初始化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論