Java冷知識:你知道什麼是標記接口嗎?

什麼是接口

首先要明確接口的含義,接觸過Java語言的同學想必已經對接口熟悉的不能再熟悉了,畢竟“接口”和“類”作為Java語言的血和肉是開發過程中不可或缺的重要組成部分。這裡引用“菜鳥教程”的解釋簡單做下說明。

接口(英文:Interface),在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。

接口並不是類,編寫接口的方式和類很相似,但是它們屬於不同的概念。類描述對象的屬性和方法。接口則包含類要實現的方法。

簡而言之,“接口”是一個類具有某些能力的聲明。

Java冷知識:你知道什麼是標記接口嗎?

什麼是標記接口

接下來看看什麼是標記接口?標記接口有時也叫標籤接口(Tag interface),即接口不包含任何方法。雖然不包含任何方法,但是這些接口也是具有某些能力的象徵。

看下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.

簡書上一個翻譯相當貼切,這裡引用下,方便大家理解

標記接口是計算機科學中的一種設計思路。編程語言本身不支持為類維護元數據。而標記接口則彌補了這個功能上的缺失——一個類實現某個沒有任何方法的標記接口,實際上標記接口從某種意義上說就成為了這個類的元數據之一。運行時,通過編程語言的反射機制,我們就可以在代碼裡拿到這種元數據。

其實說白了就是用標記接口聲明具有某種能力,這種能力是在運行時獲得的,即根據一個類是否實現了標記接口來判斷是否具有這種能力(反射)。

Java冷知識:你知道什麼是標記接口嗎?

Java中標記接口有哪些

目前看來,Java中的標記接口有Serializable、RandomAccess和Cloneable三個。在查看JDK源碼或開源項目源碼的時候,這些標記接口的上鏡率相當之高,它們不包含任何的方法,但是卻廣泛的存在。

1、Serializable

Java冷知識:你知道什麼是標記接口嗎?

java.io.Serializable這個接口是用來標記類是否支持序列化的,所謂的序列化就是將對象(此處注意:對象,非基礎數據類型)的各種信息轉換成可以存儲或者傳輸的二進制形式。如果一個類沒有實現該接口,卻被拿去序列化的了,那麼虛擬機就會拋出不支持序列化的異常,也即:NotSerializableException。

Java冷知識:你知道什麼是標記接口嗎?

2、Cloneable

Java冷知識:你知道什麼是標記接口嗎?

Cloneable接口在深度拷貝的時候經常被用到,它的作用是標記該對象是否擁有克隆的能力。大家這裡可能會感覺有一點點奇怪,眾所周知Object類中本身已經有了一個方法clone(),講道理每一個類都應該可以重寫clone()方法才對,為什麼還需要這樣一個Cloneable標記接口呢?

Java冷知識:你知道什麼是標記接口嗎?

大家動動心思想一想,如果不通過標記接口這種方式,我們在平時的開發中,會採用什麼方式去實現呢?

一般來說都是通過增加狀態變量來達到控制(從無狀態到有狀態)的效果,這樣或許能解決問題,但是實現方式就顯得不太專業,為什麼呢?Java是一門面向對象的語言,而這種方式明顯與面向對象這種思想相去甚遠,顯得臃腫繁瑣,不夠優雅。

Java冷知識:你知道什麼是標記接口嗎?

從另外一個角度想呢,接口是一個類具有某些能力的聲明,而標記接口則是在面向對象的角度來看更高級的一種抽象:即使你擁有這個方法也不行,因為你沒有這個功能的標記接口,所以在調用clone()方法的過程中,如果對象沒有實現Cloneable接口,那麼虛擬機就會拋出一個CloneNotSupportedException異常。

3、RandomAccess

Java冷知識:你知道什麼是標記接口嗎?

這個接口的作用是判斷集合能否快速訪問,也就是通過索引下標能否快速的移動到對應的元素上。換句話說,實現這個接口的集合的底層實現上元素間在物理上(隨機訪問)必須是連續的。

Java冷知識:你知道什麼是標記接口嗎?

我們在使用某個集合類中,集合中的元素可以通過索引index下標快速的訪問到,那麼在該類的定義處,一般會有一個RandomAccess接口的實現標籤,比如:java.util.ArrayList有這個接口,java.util.LinkedList就沒有。

歡迎關注收藏

私聊獲取技術乾貨,面試技巧,BATJ大牛一對一在線指導


分享到:


相關文章: