亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java中標記接口的意義是什么?為什么沒有它們我們就不能繼續下去?

java中標記接口的意義是什么?為什么沒有它們我們就不能繼續下去?

白衣染霜花 2024-01-05 10:20:30
我已經閱讀了有關標記接口的內容,并且對如何在代碼中使用它們有了一些了解,但我不明白為什么我們需要它們以及引入這個概念的原因是什么。我在互聯網上搜索,所有答案都是“它們向 JVM 提供一些基本信息,以便 JVM 可以執行一些有用的操作”,但問題是為什么 JVM 需要知道這一點以及 JVM 可能執行哪些操作必須執行?為什么我不能只克隆對象而不從 Clonable 擴展類?為什么我不能序列化類對象而不從 Serialized 擴展它?標記界面沒有多大意義,在我看來顯然不是一個好的設計。沒有任何方法的接口???重點是什么?現在顯然這里使用注釋而不是標記接口,但問題仍然是為什么 JVM 需要知道?
查看完整描述

4 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

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

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

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

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

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

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

  • 有少量 Java SE 標記接口早于 Java 5.0,并廣泛用于用戶代碼中。我想到的兩個是SerializableCloneable。

無論我們喜歡與否,Java 都有標記接口,而且這一點不太可能改變。


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

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

從 1997 年的角度來看,當時 Java 還很新,C# 也已經面世 5 年了,唯一具有注釋之類的主流語言是 LISP 版本。

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

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


查看完整回答
反對 回復 2024-01-05
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

您不需要實現 Serialized 來進行序列化,也不需要實現 Cloneable 來進行克隆。這些接口的要點在于,Java 內置了用于克隆和序列化的機制,如果您希望使用這些內置機制,則只需實現這些接口即可。

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

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


查看完整回答
反對 回復 2024-01-05
?
白豬掌柜的

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。


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


查看完整回答
反對 回復 2024-01-05
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

任何類都可以實現它而無需添加任何額外的方法/字段/開銷

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

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

仍然還有@Configuration標記注釋

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


查看完整回答
反對 回復 2024-01-05
  • 4 回答
  • 0 關注
  • 224 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號