国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

什么是Java Marker Interface(標(biāo)記接口)

xiaoxiaozi / 1483人閱讀

摘要:而標(biāo)記接口則彌補(bǔ)了這個(gè)功能上的缺失一個(gè)類實(shí)現(xiàn)某個(gè)沒有任何方法的標(biāo)記接口,實(shí)際上標(biāo)記接口從某種意義上說就成為了這個(gè)類的元數(shù)據(jù)之一。運(yùn)行時(shí),通過編程語言的反射機(jī)制,我們就可以在代碼里拿到這種元數(shù)據(jù)。之前維護(hù)元數(shù)據(jù)的重任就落在標(biāo)記接口上了。

先看看什么是標(biāo)記接口?標(biāo)記接口有時(shí)也叫標(biāo)簽接口(Tag interface),即接口不包含任何方法。在Java里很容易找到標(biāo)記接口的例子,比如JDK里的Serializable接口就是一個(gè)標(biāo)記接口。

首先明確一點(diǎn),Marker Interface(標(biāo)記接口)決不是Java這門編程語言特有的,而是計(jì)算機(jī)科學(xué)中一種通用的設(shè)計(jì)理念。

我們看Wikipedia里對標(biāo)記接口的定義。

“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翻譯上面這段話,翻得很差勁,所以我來解釋一下。

標(biāo)記接口是計(jì)算機(jī)科學(xué)中的一種設(shè)計(jì)思路。編程語言本身不支持為類維護(hù)元數(shù)據(jù)。而標(biāo)記接口則彌補(bǔ)了這個(gè)功能上的缺失——一個(gè)類實(shí)現(xiàn)某個(gè)沒有任何方法的標(biāo)記接口,實(shí)際上標(biāo)記接口從某種意義上說就成為了這個(gè)類的元數(shù)據(jù)之一。運(yùn)行時(shí),通過編程語言的反射機(jī)制,我們就可以在代碼里拿到這種元數(shù)據(jù)。

以Serializable接口為例。一個(gè)類實(shí)現(xiàn)了這個(gè)接口,說明它可以被序列化。因此,我們實(shí)際上通過Serializable這個(gè)接口,給該類標(biāo)記了“可被序列化”的元數(shù)據(jù),打上了“可被序列化”的標(biāo)簽。這也是標(biāo)記/標(biāo)簽接口名字的由來。

下面的代碼是我從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ù)組,枚舉類和普通類是分別進(jìn)行的。如果當(dāng)前待序列化的變量既不是字符串,也不是數(shù)組和枚舉類,那么就檢測該類是否實(shí)現(xiàn)了Serializable的接口,大家注意下圖第1177行就執(zhí)行了這種檢測。如果沒有實(shí)現(xiàn)Serializable接口,就會拋出異常NotSerializableException。

大家也許會問,在Spring里滿天飛的注解(Annotation)不是最好的用來維護(hù)元數(shù)據(jù)的方式么?確實(shí),Annotation能聲明在Java包、類、字段、方法、局部變量、方法參數(shù)等的前面用于維護(hù)元數(shù)據(jù)的目的,既靈活又方便。然而這么好的東西,只有在JDK1.5之后才能用。JDK1.5之前維護(hù)元數(shù)據(jù)的重任就落在標(biāo)記接口上了。

大家看另一個(gè)標(biāo)記接口,Cloneable。下圖第51行清晰標(biāo)注了該接口從JDK1.0起就有了。

JDK源代碼里的Clone方法的注釋也清晰注明了,如果一個(gè)類沒有實(shí)現(xiàn)Cloneable接口,在執(zhí)行clone方法時(shí)會拋出CloneNotSupportedException異常。

要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙"或者掃描下面二維碼:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71809.html

相關(guān)文章

  • 使用JavaScript ES6的新特性計(jì)算Fibonacci(非波拉契數(shù)列)

    摘要:采用的生成非波拉契數(shù)列提供了原生的支持,語法非常有特色,關(guān)鍵字后面緊跟一個(gè)星號。的詳細(xì)介紹參考官網(wǎng)先看如何用這個(gè)黑科技重新實(shí)現(xiàn)非波拉契樹立的生成。在這個(gè)內(nèi)部,我們定義了一個(gè)無限循環(huán),用于計(jì)算非波拉契數(shù)列。 程序員面試系列 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請求的原因? Java程序員面試系列-什么...

    yanbingyun1990 評論0 收藏0
  • 深入淺出 Java 8 Lambda 表達(dá)式

    摘要:在支持一類函數(shù)的語言中,表達(dá)式的類型將是函數(shù)。匿名函數(shù)的返回類型與該主體表達(dá)式一致如果表達(dá)式的主體包含一條以上語句,則表達(dá)式必須包含在花括號中形成代碼塊。注意,使用表達(dá)式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達(dá)式產(chǎn)生的背景和用法,以及 Lambda 表達(dá)式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向?qū)ο笳Z言,除了部分簡...

    wdzgege 評論0 收藏0
  • Java基礎(chǔ)02-自定義注解詳解

    摘要:注解概念注解也被成為元數(shù)據(jù)為我們在代碼中添加信息提供了一種形式化的方式,使我們可以在稍后的某個(gè)時(shí)刻更容易的使用這些數(shù)據(jù)。 注解 概念 注解(也被成為元數(shù)據(jù))為我們在代碼中添加信息提供了一種形式化的方式,使我們可以在稍后的某個(gè)時(shí)刻更容易的使用這些數(shù)據(jù)。 注解是 Java 5 所引入的眾多語言變化之一: 注解使得我們可以以編譯器驗(yàn)證的格式存儲程序的額外信息 注解可以生成描述符文件,甚至是...

    andong777 評論0 收藏0
  • 為了監(jiān)視快遞小哥,我做了一個(gè)小程序!

    摘要:因?yàn)槲覀冃枰_定是地圖上任意一個(gè)點(diǎn)上某個(gè)范圍內(nèi)的送餐員電話所以我們需要一某個(gè)點(diǎn)為中心畫圓當(dāng)然高德地圖給我們提供了這樣的一個(gè)接口。 我感覺我可以在電腦上查看快遞小哥離我有多遠(yuǎn)了! 應(yīng)用演示地址: http://geomap.wilddogapp.com/ 源碼下載: http://git.oschina.net/chengxinxin/wildGeo 下載到本地解壓后即可運(yùn)行。由于流量...

    BLUE 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<