[英]What's the good of Marker Interface?
標記界面的想法或目的對我來說完全沒有意義。
在Java中搜索“可序列化類”時,我不可避免地想到了“標記接口”這個概念。 我知道為什么以及何時使用它-標記/標記類是特殊用途的,例如序列化。
但是,這里最大的要點是,原因本身,我的意思是標記該類以表明我們將使用它進行某種用法但不使用任何方法的想法對我來說似乎是胡說八道。
如果我們想賦予一個類一些特殊的含義,以便它可以執行我們想要的工作,我堅信它應該包含為該工作編寫的方法。 如果內部沒有任何內容,那與普通類又有什么不同呢? 我什至可以將“實現可序列化”放入任何不打算序列化的類中。
總結一下-標記界面的作用是什么?
標記接口僅用於類型識別。 除此之外,標記接口沒有特定用途。
例如,您提到的Serializable是沒有任何功能的Marker接口的一個很好的例子。 JVM標識了實現Serializable的類及其對象,以進行序列化過程。
因此,如果我們要確定對象類型以執行任何特定操作。 我們可以創建自己的Marker接口並使用它。
標記界面確實應該避免。
在沒有標記接口的情況下,可以通過多種方法完成與使用標記接口的方法相同的工作,並且絕對應首選使用這些方法,因為標記接口被視為有點代碼味道。
在C#中,可以使用可以應用於類的屬性。 盡管絕對安全,但它們絕對較慢,因為安全轉換的速度相當快,但是有一些方法可以通過例如基於輸入類型的緩存來提高速度。
我發現在許多情況下使用普通object
(而不是期望標記接口)可能更靈活,因為這對實現者造成的負擔較小。
確實不需要標記界面。
在Java引入注釋之前(在JDK 5中),標記接口最初用於將特殊含義附加到類上。 例如,可Serializable
接口是在JDK 1.1中創建的。 隨着注釋的引入,一種更好的方法(如果需要標記一個類並且不需要其他方法)是使用注釋。
例如,代替讓類實現沒有方法的Serializable
接口,一種更好的方法是創建一個@Serializable
批注, @Serializable
該批注應用於類(請注意, @Serializable
不是包含在其中的真實批注。 JDK)。
@Serializable
public class Foo {}
有關如何創建和處理批注的更多信息,請參見使用Java創建批注 (請原諒,我寫了這篇文章;它包含了您需要了解的有關批注處理的信息,而無需在此處直接復制該批注而使答案變得混亂)。
另一種方法是更改標記界面后面的思維過程,而不是處理類並根據其標記執行動作,將邏輯推到類本身。 例如,代替尋找具有Serializable
類然后執行邏輯,可以將邏輯直接移到Serializable
接口,從而允許客戶端直接在對象上調用序列化邏輯。 例如:
public interface Serializable {
public default void writeObject(ObjectOutputStream out) throws IOException {
// ... default logic ...
}
public default void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// ... default logic ...
}
public default void readObjectNoData() throws ObjectStreamException {
// ... default logic ...
}
}
然后可以將可序列化的對象直接序列化:
public class Foo implements Serializable {}
ObjectOutputStream os = // ... some output stream
Foo foo = new Foo();
foo.writeObject(os);
標記接口用於為類提供支持,該類未通過重寫方法實現。
例如,當您聲明一個類實現Serializable
或Cloneable
,即允許將其傳遞給需要這些類型的方法,並承諾通過Liskov替換原理遵守該類型的協定: https:// en .wikipedia.org / wiki / Liskov_substitution_principle
一個接口的隱含契約不僅僅是它使您重寫的方法。
標記接口非常罕見,因為它對於使用接口方法實現的接口所需的功能幾乎總是更好。 有時候,就像Serializable
和Cloneable
,由於某種原因,它並不適合該模式。 在這些情況下使用標記器接口,因為接口的其他功能仍然有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.