4 回答

TA貢獻1805條經驗 獲得超10個贊
您清楚地了解標記接口的作用。你自己也這么說啊!
那么為什么我們還需要它們呢?
從某種意義上說,我們不需要它們。任何可以用標記接口表達的東西都可以用注釋來表達。毫無疑問,注釋是解決問題的一種更簡潔的方法。
我們(仍然)擁有標記接口的根本原因是歷史:
Java 注釋是在 Java 5.0 中添加到 Java 語言中的。在此之前,標記接口是可用的最佳解決方案。
從類中刪除標記接口會破壞二進制兼容性。
有少量 Java SE 標記接口早于 Java 5.0,并廣泛用于用戶代碼中。我想到的兩個是
Serializable
和Cloneable
。
無論我們喜歡與否,Java 都有標記接口,而且這一點不太可能改變。
標記界面沒有多大意義,在我看來顯然不是一個好的設計。
嗯,是。從2019年的角度來看,確實如此。
從 1997 年的角度來看,當時 Java 還很新,C# 也已經面世 5 年了,唯一具有注釋之類的主流語言是 LISP 版本。
現在我非常確定,早在 Java 1.0 時代,Java 類庫的設計者就意識到標記接口是一個有缺陷的想法。但他們別無選擇。它是使用標記接口,或者將一些漂亮的 Java 基礎 API 的設計和實現推遲 5 年或更長時間。
在企業計算領域,您需要做出妥協才能完成工作。

TA貢獻1784條經驗 獲得超8個贊
您不需要實現 Serialized 來進行序列化,也不需要實現 Cloneable 來進行克隆。這些接口的要點在于,Java 內置了用于克隆和序列化的機制,如果您希望使用這些內置機制,則只需實現這些接口即可。
因此,只需實現 Serialized,您就可以自動將該類與 ObjectInputStream 和 ObjectOutputStream 一起使用,而無需任何額外的代碼。
另一方面,我發現可克隆幾乎毫無用處。通常,您只需實現 Cloneable 并覆蓋Object.clone
并將其公開,然后您就可以立即進行克隆。但據說它被破壞了,你最好只編寫自己的克隆邏輯,就像使用復制構造函數一樣。

TA貢獻1893條經驗 獲得超10個贊
我可以回答你的部分問題 - java中標記接口的意義是什么?
通過引入注解,Java 為我們提供了一種替代方法來實現與標記接口相同的結果。此外,與標記接口一樣,我們可以將注釋應用于任何類,并且可以將它們用作執行某些操作的指示符。
那么關鍵的區別是什么?
與注釋不同,接口允許我們利用多態性。因此,我們可以向標記接口添加額外的限制。
例如,讓我們添加一個限制,即只能從數據庫中刪除 Shape 類型:
public interface Shape {
double getArea();
double getCircumference();
}
在這種情況下,我們的標記界面(我們稱之為 DeletableShape)將如下所示:
public interface DeletableShape extends Shape {
}
然后我們的類將實現標記接口:
public class Rectangle implements DeletableShape {
// implementation details
}
因此,所有DeletableShape 實現也是 Shape 實現。顯然,我們不能使用注釋來做到這一點。
然而,每個設計決策都需要權衡,多態性可以用作針對標記接口的反駁。在我們的示例中,每個擴展 Rectangle 的類都會自動實現 DeletableShape。
這可能無法提供您想要的確切答案。但可以部分幫助你。

TA貢獻1831條經驗 獲得超9個贊
任何類都可以實現它而無需添加任何額外的方法/字段/開銷
您只需標記類即可使用/序列化
即使在 Java 5.0 引入注釋之后,
仍然還有@Configuration標記注釋
@Configuration注解用于基于Spring注解的配置。@Configuration 是一個標記注釋,它指示一個類聲明一個或多個 @Bean 方法,并且可以由 Spring 容器處理以在運行時生成 bean 定義和這些 bean 的服務請求
添加回答
舉報