簡體   English   中英

java 中的標記接口有什么意義?為什么我們不能沒有它們 go?

[英]What is the point of marker interface in java and why can't we go on without them?

我已經閱讀了有關標記接口的內容,並且對如何在代碼中使用它們有了一些了解,但是我不明白為什么我們需要它們以及引入這個概念的原因是什么。

I search on the internet and all the answer are along the lines of "they provide some essential information to the JVM so that JVM may perform some useful operations" but the question is that why JVM needs to know that and what possible operation does the JVM必須執行? 為什么我不能只克隆 object 而不從 Clonable 擴展 class? 為什么我不能在不從 Serializable 擴展的情況下序列化 class object?

標記界面沒有多大意義,在我看來顯然不是一個好的設計。 沒有任何方法的接口??? 重點是什么?

現在顯然這里要使用注釋而不是標記接口,但問題仍然是為什么 JVM 需要知道?

您清楚地了解標記接口的作用。 你自己也是這么說的!

那么為什么我們還需要它們呢?

從某種意義上說,我們不需要它們。 您可以使用標記接口表達的任何內容都可以使用注釋來表達。 毫無疑問,注釋是解決問題的一種更簡潔的方法。

我們(仍然)擁有標記接口的根本原因是History

  • Java 注釋已添加到 Java 5.0 中的 Java 語言中。 在此之前,標記接口是可用的最佳解決方案。

  • 從 class 中刪除標記接口會破壞二進制兼容性。

  • 有少量 Java SE 標記接口早於 Java 5.0,並廣泛用於用戶代碼。 spring 想到的兩個是SerializableCloneable

不管我們喜不喜歡,Java 都有標記接口,這不太可能改變。


標記界面沒有多大意義,在我看來顯然不是一個好的設計。

嗯,是。 從2019年的角度來看,確實如此。

從 1997 年的角度來看,當 Java 是新的並且 C# 是 5 年后,唯一具有類似注釋的主流(-ish)語言是 LISP 版本。

現在我很確定 Java 1.0 時代的 Java 1.0 時代的 Java class 庫的設計者意識到標記接口是一個有缺陷的想法。 但他們別無選擇。 它是使用標記接口,或者將一些漂亮的 Java 基礎 API 的設計和實現推遲 5 年或更長時間。

在企業計算領域,您需要做出妥協才能完成工作。

任何 class 的點都可以在不添加任何額外方法/字段/開銷的情況下實現它

您只需標記class 即可使用/序列化

即使在引入注釋的 Java 5.0 之后,

還有標記注釋作為@Configuration

@Configuration 注解用於基於 Spring 注解的配置。 @Configuration 是一個標記注解,它表明 class 聲明了一個或多個 @Bean 方法,並且可以由 Spring 容器處理以在運行時為這些 bean 生成 bean 定義和服務請求

無需實現 Serializable 即可進行序列化,也無需實現 Cloneable 即可進行克隆。 這些接口的重點是 Java 內置了用於克隆和序列化的機制,如果您希望使用這些內置機制,您只需要實現這些接口。

因此,只需實現 Serializable,您就可以自動將 class 與 ObjectInputStream 和 ObjectOutputStream 一起使用,而無需任何額外代碼。

另一方面,我覺得可克隆幾乎沒用。 通常,您只需實現 Cloneable 並覆蓋Object.clone並將其公開,您就可以立即進行克隆。 但據說它被破壞了,你最好只編寫自己的克隆邏輯,就像使用復制構造函數一樣。

我可以回答您的部分問題 - java 中的標記接口有什么意義?

通過引入注解,Java 為我們提供了一種替代方案,可以實現與標記接口相同的結果。 此外,像標記接口一樣,我們可以將注釋應用於任何 class,我們可以將它們用作指標來執行某些操作。

那么關鍵的區別是什么?

與注解不同,接口允許我們利用多態性 因此,我們可以為標記界面添加額外的限制。

例如,讓我們添加一個限制,即只能從數據庫中刪除 Shape 類型:

public interface Shape {
    double getArea();
    double getCircumference();
}

在這種情況下,我們的標記接口,我們稱之為 DeletableShape,將如下所示:

public interface DeletableShape extends Shape {
}

然后我們的 class 將實現標記接口:

public class Rectangle implements DeletableShape {
    // implementation details
}

因此,所有的 DeletableShape 實現也是 Shape 實現 顯然,我們不能使用 annotations 來做到這一點

然而,每個設計決策都有權衡,多態性可以用作反對標記接口的反駁 在我們的示例中,每個擴展 Rectangle 的 class 都會自動實現 DeletableShape。


這可能無法提供您想要的確切答案。 但可以部分幫助你。

來源: baeldung.com

不包含方法、字段和常量的接口稱為標記接口。 換句話說,一個空的接口被稱為標記接口或標簽接口。 它提供有關 object 的運行時類型信息。 這就是 JVM 和編譯器有關於 object 的附加信息的原因。 Serializable 和 Cloneable 接口是標記接口的示例。 簡而言之,它向 JVM 指示信號或命令。 例如,當您工作 I/O 時,您會了解這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM