Effective Java(3rd)-Item41 使用標(biāo)記接口定義類型

??一個(gè)標(biāo)記接口是一個(gè)接口,沒有包含方法聲明僅委托(或“標(biāo)記”)一個(gè)實(shí)現(xiàn)該接口的類具有某些屬性叉寂。比如狼犯,考慮Serializable接口(第12章).通過實(shí)現(xiàn)這個(gè)接口外里,一個(gè)類指示了它的實(shí)例可以被寫為一個(gè)ObjectOutputStream(或“序列化的”)疏虫。
??你可能會(huì)聽說標(biāo)記注解( item39 )導(dǎo)致標(biāo)記接口過時(shí)了永罚。這個(gè)斷言是不正確的。標(biāo)記接口比標(biāo)記注解有兩個(gè)優(yōu)勢议薪。首先也是最重要的尤蛮, 標(biāo)記接口定義由標(biāo)記類的實(shí)例實(shí)現(xiàn)的類型媳友,標(biāo)記注解不能斯议。標(biāo)記類下的存在允許你在編譯時(shí)間捕獲錯(cuò)誤,如果你使用一個(gè)標(biāo)記注解醇锚,在運(yùn)行時(shí)間之前不能捕獲異常哼御。

??Java的序列化設(shè)施(第六章)使用Serializable標(biāo)記接口來指示一個(gè)類型是可序列化的。ObjectOutputStream.writeObject方法焊唬,用來傳遞序列化的對象恋昼,需要它的參數(shù)是被序列化的。如果該方法的參數(shù)擁有Serializable類型赶促,在編譯時(shí)(通過類型檢查)會(huì)檢測到序列化了不合適的對象液肌。編譯時(shí)間錯(cuò)誤的檢測是標(biāo)記接口的意圖,但是不幸的是鸥滨, ObjectOutputStream.write API并沒有利用Serializable接口的優(yōu)勢:它的參數(shù)被聲明為Object類型嗦哆,所以嘗試序列化一個(gè)未序列化的對象在運(yùn)行時(shí)間并不會(huì)失敗。
??另一個(gè)標(biāo)記接口比標(biāo)記注解的好的地方是它們定位更精確婿滓。如果一個(gè)注解類型通過目標(biāo)ElementType.TYPE聲明老速,它可以應(yīng)用于任何類或接口。假設(shè)你有一個(gè)標(biāo)記只適用于特定接口的實(shí)現(xiàn)凸主。如果你定義它作為標(biāo)記接口橘券,你可以讓他繼承其適用的僅有的接口,確保所有標(biāo)記類型也都是其適用的唯一接口的子類型。
??可以說旁舰,Set接口就只是一個(gè) 受限制的標(biāo)記接口锋华。它只對Collection的子類型適用,但是除了通過Collection定義的方法鬓梅,它沒有添加任何方法供置。它通常不被認(rèn)為是標(biāo)記接口因?yàn)樗纳屏艘恍〤ollection方法的契約,包括add,equals绽快,hashCode.但是很容易想象一個(gè)標(biāo)記接口只適用于一些特定接口的子類型芥丧,并沒有改善任何接口的方法。這樣的標(biāo)記接口可能描述了整個(gè)對象的一些不變量或指示實(shí)例夠資格來處理一些其他類的方法(通過Serializable接口指示實(shí)例符合ObjectOutputStream處理的條件)
??標(biāo)記注解比標(biāo)記接口的主要優(yōu)勢是它們是更大的注解工具的一部分坊罢。因此续担,標(biāo)記注解允許在基于注解的框架中保持一致性。
??那么我們什么時(shí)候應(yīng)該用標(biāo)記注解什么時(shí)候應(yīng)該用標(biāo)記接口呢活孩?如果標(biāo)記應(yīng)用于任何程序元素而不是類或接口時(shí)物遇,明顯你必須使用一個(gè)注解,因?yàn)橹挥蓄惡徒涌谀軌驅(qū)崿F(xiàn)或繼承接口憾儒。如果只允許標(biāo)記類和接口询兴,問你自己一個(gè)問題:我想要編寫一個(gè)或更多只接受這個(gè)標(biāo)記的對象的方法嘛?如果是起趾,你應(yīng)該使用一個(gè)標(biāo)記接口而不是標(biāo)記注解诗舰。這將使您能夠?qū)⒔涌谟米飨嚓P(guān)方法的參數(shù)類型,這將帶來編譯時(shí)類型檢查的好處训裆。如果你可以說服自己你將永遠(yuǎn)不會(huì)想要編寫一個(gè)方法只接受標(biāo)記的對象眶根,你大概更希望使用標(biāo)記注解。此外边琉,如果標(biāo)記是大量使用注解的框架的一部分属百,那么標(biāo)記注解就是明顯的選擇。
??總之变姨,標(biāo)記接口和標(biāo)記注解都有它們的使用場景族扰。如果你想要定義一個(gè)沒有任何新方法關(guān)聯(lián)的類型,標(biāo)記接口才是解決之道定欧。如果你想要標(biāo)記程序元素而不是類和接口或適應(yīng)在框架中的標(biāo)記渔呵,并早已有了注解類型的大量使用,標(biāo)記注解就是正確的選擇忧额。 如果您發(fā)現(xiàn)自己正在編寫目標(biāo)為ElementType.TYPE的標(biāo)記注解類型厘肮,花點(diǎn)時(shí)間弄清楚它究竟應(yīng)該是注解類型,還是標(biāo)記接口更合適睦番。
??某種意義上說类茂,這個(gè)item是Item22( item22 )的倒序耍属,”如果你不想要定義一個(gè)類型,不要使用一個(gè)接口“巩检,最接近的說法是厚骗,”如果你確實(shí)想要定義一個(gè)類型,使用接口“兢哭。

本文寫于2019.7.10领舰,歷時(shí)2天

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迟螺,隨后出現(xiàn)的幾起案子冲秽,更是在濱河造成了極大的恐慌,老刑警劉巖矩父,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锉桑,死亡現(xiàn)場離奇詭異,居然都是意外死亡窍株,警方通過查閱死者的電腦和手機(jī)民轴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來球订,“玉大人后裸,你說我怎么就攤上這事∶疤玻” “怎么了微驶?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旦部。 經(jīng)常有香客問我祈搜,道長较店,這世上最難降的妖魔是什么士八? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮梁呈,結(jié)果婚禮上婚度,老公的妹妹穿的比我還像新娘。我一直安慰自己官卡,他們只是感情好蝗茁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寻咒,像睡著了一般哮翘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毛秘,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天饭寺,我揣著相機(jī)與錄音阻课,去河邊找鬼。 笑死艰匙,一個(gè)胖子當(dāng)著我的面吹牛限煞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播员凝,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼署驻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了健霹?” 一聲冷哼從身側(cè)響起旺上,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糖埋,沒想到半個(gè)月后抚官,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阶捆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年凌节,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洒试。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倍奢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垒棋,到底是詐尸還是另有隱情卒煞,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布叼架,位于F島的核電站畔裕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乖订。R本人自食惡果不足惜扮饶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乍构。 院中可真熱鬧兑牡,春花似錦其监、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉词。三九已至硫椰,卻和暖如春制跟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仪召。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工寨蹋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲距,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓钥庇,卻偏偏與公主長得像牍鞠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子评姨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海帶_4bbc閱讀 766評論 1 2
  • 目錄: Android:Android 0.*Android 1.*Android 2.*Android 3.*A...
    敲代碼的令狐蔥閱讀 3,802評論 0 2
  • 很多媒體就這樣吐句,不就報(bào)個(gè)出個(gè)軌嘛胁后,這不都是平常事嘛,怎么平常人出軌你怎么不曝光嗦枢,明星怎么了攀芯,都是人媒體就不曝光。再...
    小雨Ren閱讀 374評論 0 0
  • 最在乎過的 踏著不同城市的夜色 跳動(dòng)如萬馬蹄聲 已意知失去的 即使未敢合眼 也是浪費(fèi) 你我奔波如瀾 情深念及 故人...
    echo澤西閱讀 351評論 0 6
  • 也許你的生活并不富裕文虏,也許你的工作不夠好侣诺,也許你正處在困境中,也許你被情所棄氧秘。不論什么原因年鸳,請你在出門時(shí),一定要讓...
    阿杰_淀山湖閱讀 220評論 1 1