摘要:而標記接口則彌補了這個功能上的缺失一個類實現(xiàn)某個沒有任何方法的標記接口,實際上標記接口從某種意義上說就成為了這個類的元數(shù)據(jù)之一。運行時,通過編程語言的反射機制,我們就可以在代碼里拿到這種元數(shù)據(jù)。之前維護元數(shù)據(jù)的重任就落在標記接口上了。
先看看什么是標記接口?標記接口有時也叫標簽接口(Tag interface),即接口不包含任何方法。在Java里很容易找到標記接口的例子,比如JDK里的Serializable接口就是一個標記接口。
首先明確一點,Marker Interface(標記接口)決不是Java這門編程語言特有的,而是計算機科學中一種通用的設計理念。
我們看Wikipedia里對標記接口的定義。
“The tag/ marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata.“
我試了下Google Translate翻譯上面這段話,翻得很差勁,所以我來解釋一下。
標記接口是計算機科學中的一種設計思路。編程語言本身不支持為類維護元數(shù)據(jù)。而標記接口則彌補了這個功能上的缺失——一個類實現(xiàn)某個沒有任何方法的標記接口,實際上標記接口從某種意義上說就成為了這個類的元數(shù)據(jù)之一。運行時,通過編程語言的反射機制,我們就可以在代碼里拿到這種元數(shù)據(jù)。
以Serializable接口為例。一個類實現(xiàn)了這個接口,說明它可以被序列化。因此,我們實際上通過Serializable這個接口,給該類標記了“可被序列化”的元數(shù)據(jù),打上了“可被序列化”的標簽。這也是標記/標簽接口名字的由來。
下面的代碼是我從JDK源代碼中摘出來的:
if (obj instanceof String) { writeString((String) obj, unshared); } else if (cl.isArray()) { writeArray(obj, desc, unshared); } else if (obj instanceof Enum) { writeEnum((Enum) obj, desc, unshared); } else if (obj instanceof Serializable) { writeOrdinaryObject(obj, desc, unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException(cl.getName() + " " + debugInfoStack.toString()); } else { throw new NotSerializableException(cl.getName()); } }
Java里的序列化,字符串,數(shù)組,枚舉類和普通類是分別進行的。如果當前待序列化的變量既不是字符串,也不是數(shù)組和枚舉類,那么就檢測該類是否實現(xiàn)了Serializable的接口,大家注意下圖第1177行就執(zhí)行了這種檢測。如果沒有實現(xiàn)Serializable接口,就會拋出異常NotSerializableException。
大家也許會問,在Spring里滿天飛的注解(Annotation)不是最好的用來維護元數(shù)據(jù)的方式么?確實,Annotation能聲明在Java包、類、字段、方法、局部變量、方法參數(shù)等的前面用于維護元數(shù)據(jù)的目的,既靈活又方便。然而這么好的東西,只有在JDK1.5之后才能用。JDK1.5之前維護元數(shù)據(jù)的重任就落在標記接口上了。
大家看另一個標記接口,Cloneable。下圖第51行清晰標注了該接口從JDK1.0起就有了。
JDK源代碼里的Clone方法的注釋也清晰注明了,如果一個類沒有實現(xiàn)Cloneable接口,在執(zhí)行clone方法時會拋出CloneNotSupportedException異常。
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙"或者掃描下面二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71809.html
摘要:采用的生成非波拉契數(shù)列提供了原生的支持,語法非常有特色,關(guān)鍵字后面緊跟一個星號。的詳細介紹參考官網(wǎng)先看如何用這個黑科技重新實現(xiàn)非波拉契樹立的生成。在這個內(nèi)部,我們定義了一個無限循環(huán),用于計算非波拉契數(shù)列。 程序員面試系列 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應HTTP請求的原因? Java程序員面試系列-什么...
摘要:在支持一類函數(shù)的語言中,表達式的類型將是函數(shù)。匿名函數(shù)的返回類型與該主體表達式一致如果表達式的主體包含一條以上語句,則表達式必須包含在花括號中形成代碼塊。注意,使用表達式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達式產(chǎn)生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向?qū)ο笳Z言,除了部分簡...
摘要:注解概念注解也被成為元數(shù)據(jù)為我們在代碼中添加信息提供了一種形式化的方式,使我們可以在稍后的某個時刻更容易的使用這些數(shù)據(jù)。 注解 概念 注解(也被成為元數(shù)據(jù))為我們在代碼中添加信息提供了一種形式化的方式,使我們可以在稍后的某個時刻更容易的使用這些數(shù)據(jù)。 注解是 Java 5 所引入的眾多語言變化之一: 注解使得我們可以以編譯器驗證的格式存儲程序的額外信息 注解可以生成描述符文件,甚至是...
摘要:因為我們需要確定是地圖上任意一個點上某個范圍內(nèi)的送餐員電話所以我們需要一某個點為中心畫圓當然高德地圖給我們提供了這樣的一個接口。 我感覺我可以在電腦上查看快遞小哥離我有多遠了! 應用演示地址: http://geomap.wilddogapp.com/ 源碼下載: http://git.oschina.net/chengxinxin/wildGeo 下載到本地解壓后即可運行。由于流量...
閱讀 3225·2021-11-08 13:21
閱讀 1202·2021-08-12 13:28
閱讀 1413·2019-08-30 14:23
閱讀 1935·2019-08-30 11:09
閱讀 850·2019-08-29 13:22
閱讀 2694·2019-08-29 13:12
閱讀 2557·2019-08-26 17:04
閱讀 2265·2019-08-26 13:22