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

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

Java中的標記接口?

Java中的標記接口?

ITMISS 2019-10-24 15:10:52
我被告知Java中的Marker接口是一個空接口,用于向編譯器或JVM發出信號,告知實現該接口的類的對象必須以特殊方式處理,例如序列化,克隆等。但是最近我了解到它實際上與編譯器或JVM無關。例如,在使用Serializable接口的情況下,的方法writeObject(Object)會ObjectOutputStream執行類似的操作instanceOf Serializable來檢測類是否相應地實現Serializable和拋出NotSerializableException。一切都在代碼中處理,這似乎是一種設計模式,所以我認為我們可以定義自己的標記接口?,F在我的疑問:上面第一點提到的標記接口的定義是否錯誤?那么我們如何定義Marker接口呢?并且instanceOf為什么不使用運算符而不是使用運算符,所以為什么要使用writeObject(Serializable)編譯時類型檢查而不是運行時呢?注釋比標記接口如何好?
查看完整描述

3 回答

?
幕布斯7119047

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

  1. 上面第一點提到的標記接口的定義是否錯誤?-在以下部分中是正確的:(1)標記接口必須為空,并且(2)實現該接口意味著要對實現類進行某些特殊處理。不正確的部分是,這意味著JVM或編譯器將以不同的方式對待該類的對象:您正確地觀察到是Java類庫的代碼將這些對象視為可克隆,可序列化等。與編譯器或JVM無關。

  2. 而不是使用instanceOf運算符,為什么該方法不能這樣,writeObject(Serializable)以至于進行編譯時類型檢查 -這樣可以避免在需要“普通Object” 時用標記接口的名稱污染代碼。例如,如果您創建一個需要可序列化并且具有對象成員的類,那么您將不得不進行強制轉換或Serializable在編譯時創建對象。這很不方便,因為該接口沒有任何功能。

  3. 注釋比標記接口如何好?-它們使您達到了將有關類的元數據傳送給其使用者的相同目的,而無需為其創建單獨的類型。注釋也更加強大,它使程序員可以將更復雜的信息傳遞給“消費”它的類。


查看完整回答
反對 回復 2019-10-24
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

不能強制執行Serializable,writeObject因為不可序列化類的子級可以序列化,但是它們的實例可能被向上轉換回父類。因此,持有對無法序列化的內容(例如Object)的引用并不意味著所引用的實例確實無法序列化。例如在


   Object x = "abc";

   if (x instanceof Serializable) {

   }

父類(Object)無法序列化,可以使用其無參數構造函數進行初始化。通過引用的價值x,String是序列化的條件語句將運行。


查看完整回答
反對 回復 2019-10-24
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

a /標記接口,顧名思義,僅存在于通知類的任何東西都在聲明一個類。任何東西都可以是Serializable接口的JDK類,也可以是您為自定義類編寫的任何類。

b /如果它是標記接口,則不應暗示存在任何方法-最好在接口中包含隱含方法。但你可以決定要設計它,只要你想,如果你知道為什么 需要它

c /空接口和不使用值或參數的注釋之間幾乎沒有區別。但是區別在于:注釋可以聲明鍵/值的列表,這些鍵/值將在運行時訪問。


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 533 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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