Java中标记接口的用途是什么?

时间:2010-01-03 15:00:08

标签: java annotations marker-interfaces

当像Serializable这样的标记接口中没有任何东西可以实现时。 。实施它的用途是什么?

9 个答案:

答案 0 :(得分:85)

Joshua Bloch:Effective Java 2nd Edition,p 179

  

第37项:使用标记界面定义类型

     

...   你可能会听到它说那个标记   注释(第35项)制作标记   接口已过时。这个断言是   不正确。标记界面有两个   标记注释的优点。   首先,标记接口   定义由...实现的类型   标记类的实例;标记   注释没有。存在   此类型允许您捕获错误   在编译时你不能   如果你使用了,那就赶上运行时   标记注释....

就我个人而言,我认为我会向约书亚在这个问题上的优秀知识屈服。

答案 1 :(得分:58)

在早期版本的Java中,Marker Interfaces是声明类的元数据的唯一方法。例如,Serializable Marker Interface允许类的作者在序列化和反序列化时说他们的类将正常运行。

在现代Java中,标记接口没有位置。它们可以完全替换为Annotations,这允许非常灵活的元数据功能。如果您有关于类的信息,并且该信息永远不会更改,那么注释是表示它的非常有用的方法。

答案 2 :(得分:6)

这种标记接口在其他代码根据对象是否实现某个标记接口而做出决定的情况下非常有用。

对于Serializable,反射将用于序列化对象的字段。

现在注释是首选,因为它们不会传播到子类。

请参阅Marker interface pattern

答案 3 :(得分:4)

它表示该类(以及因此所有非瞬态的字段)是序列化的候选者。如果您正在构建一个依赖于序列化的框架,那么您当然可以编写一个方法:

public void registerObject(Serializable obj);

限制你准备接受的课程。

由于序列化对象需要保持跨系统的兼容性,因此序列化是显式设计决策,因此需要使用标记接口来识别此类候选对象。

还有一个安全方面。您不希望所有内容都可以序列化 - 否则您可能会通过序列化意外地泄露(比方说)密码或其他敏感数据。

答案 4 :(得分:3)

它们被称为标记接口。顾名思义,他们标记某些对象可用于某种操作。

Serializable表示该对象符合java序列化的条件,例如。

已经讨论过它们是否应该被注释取代,因为它们的功能非常相似。

答案 5 :(得分:3)

如果您实现了一个界面,那么instanceof将成立。如果你的接口没有任何东西可以实现,那么你可以使用它来标记一个带有元数据的类,例如Java 1.5及更高版本的注释,而不必强迫实现者做任何特别的事情。

答案 6 :(得分:1)

你的理由是,空接口不会影响程序的“标准”执行,该程序基于字段的检查/变异和方法的调度。

但是,当与反射结合使用时,标记界面非常有用:库/方法检查(通过反射)一个对象,如果它的类强加了标记接口,则工作方式不同。从Java5开始,对标记接口的需求非常少 - 可以通过Java注释实现相同的“标记”工具 - (再次)它们的大部分效果将通过基于反射的代码实现。

答案 7 :(得分:-1)

主要目的是告诉编译器对实现标记接口的类的对象采取不同的处理方式。

答案 8 :(得分:-1)

仔细查看Java中的标记界面,例如Serializable,Clonnable和Remote看起来它们用于向编译器或JVM指示某些内容。因此,如果JVM看到Class是Serializable,它就会对它进行一些特殊的操作,类似的方式如果JVM看到一个Class实现Clonnable它会执行一些操作来支持克隆。 RMI和Remote接口也是如此。因此,简而言之,Marker接口向Compiler或JVM指示,发出信号或命令。

了解详情:http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw