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

当没有什么东西在像Serializable这样的标记接口中实现的时候。 。 它有什么用处呢?

在Java的早期版本中, Marker Interfaces是声明关于类的元数据的唯一方法。 例如,Serializable标记接口让一个类的作者说,当序列化和反序列化时,他们的类将performance正确。

在现代Java中,标记接口没有地方。 它们可以完全被Annotations取代,这使得元数据function非常灵活。 如果你有关于一个类的信息,而且这个信息永远不会改变,那么注释是一种非常有用的表示方法。

Joshua Bloch:Effective Java第2版,第179页

项目37:使用标记接口来定义types

…您可能会听到说,标记注释(项目35)使标记界面过时。 这个断言是不正确的。 标记接口与标记注释相比具有两个优点。 首先,标记接口定义了一个由标记类实例实现的types; 标记注释不。 这种types的存在使您可以在编译时捕获错误,如果您使用标记注释,则无法捕捉到运行时。

就我个人而言,我想我会向约书亚在这个问题上的优秀知识低头。

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

Serializable的情况下,将使用reflection来序列化对象的字段。

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

请参阅标记界面模式 。

它表明这个类(因此所有不是瞬态的字段)都是序列化的候选对象。 如果你正在build立一个依赖于序列化的框架,你当然可以写一个方法:

 public void registerObject(Serializable obj); 

限制你准备接受的课程。

因为序列化的对象需要保持跨系统的兼容性,序列化是一个明确的devise决定 ,因此需要使用标记接口来识别这些候选。

还有一个安全方面。 你不想让所有的东西都可以serialisable – 否则你可能会不小心通过序列化(例如)密码或其他敏感数据。

如果你实现一个接口,那么instanceof将是真实的。 如果你的界面没有任何东西可以实现,那么你可以使用这个来标记一个类似元数据的类,比如Java 1.5或更高版本的注释,而不必强迫实现者做任何特殊的事情。

他们被称为标记界面。 正如名字所暗示的那样,它们表示某些对象可用于某种操作。

Serializable意味着该对象符合Java序列化的条件。

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

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

但是,标记接口在与reflection结合使用时非常有用:一个库/方法检查(通过reflection)一个对象,如果它的类引入标记接口,则工作方式不同。 从Java5开始,很less需要标记接口 – 通过Java注释可以实现相同的“标记”工具 – 这些(再次)大部分的效果将通过基于reflection的代码来实现。

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

仔细查看Java中的标记接口,例如Serializable,Clonnable和Remote,看起来它们是用来指示编译器或JVM的东西。 因此,如果JVM看到一个Class是Serializable,它就对它做了一些特殊的操作,如果JVM看到一个Class就是类似的方式,那么执行Clonnable它会执行一些操作来支持克隆。 RMI和Remote接口也是如此。 所以简而言之,标记界面指示,信号或命令给编译器或JVM。

阅读更多信息: http : //javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw