当在标记接口中没有什么要实现的Serializable
时候,实现它有什么用?
9 回答
Joshua Bloch:有效的 Java 第 2 版,第 179 页
第 37 条:使用标记接口定义类型
...您可能听说过标记注释(第 35 项)使标记接口过时。这种说法是不正确的。与标记注释相比,标记接口有两个优点。首先,标记接口定义了由标记类的实例实现的类型;标记注释没有。这种类型的存在允许您在编译时捕获错误,如果您使用标记注释,则直到运行时才能捕获......
就我个人而言,我认为我会向 Joshua 在这个主题上的卓越知识低头。
在 Java 的早期版本中,标记接口是声明类元数据的唯一方法。例如,Serializable Marker Interface 让类的作者说他们的类在序列化和反序列化时会正确运行。
在现代 Java 中,标记接口没有位置。它们可以完全被Annotations取代,这允许非常灵活的元数据功能。如果你有关于一个类的信息,并且这些信息永远不会改变,那么注释是一种非常有用的表示它的方式。
这样的标记接口在其他代码根据对象是否实现某个标记接口做出决定的情况下很有用。
在 的情况下Serializable
,将使用反射来序列化对象的字段。
现在首选注释,因为它们不会传播到子类。
请参阅标记界面模式。
它表明该类(以及因此不是瞬态的所有字段)是序列化的候选者。如果你正在构建一个依赖于序列化的框架,你当然可以这样编写一个方法:
public void registerObject(Serializable obj);
限制你准备接受的课程。
因为序列化对象需要保持跨系统的兼容性,所以序列化是一项明确的设计决策,因此需要使用标记接口来识别此类候选对象。
还有一个安全方面。您不想使所有内容都可序列化 - 否则您可能会通过序列化意外暴露(例如)密码或其他敏感数据。
它们被称为标记接口。顾名思义,它们标志着某些对象可用于某些类型的操作。
Serializable
例如,表示该对象有资格进行 java 序列化。
已经讨论过它们是否不应该被注释替换,因为它们的功能非常相似。
如果你实现一个接口,那么instanceof
将是真的。如果你的接口没有什么要实现的,那么你可以使用它来标记一个带有元数据的类,就像 Java 1.5 及更高版本的注释一样,而不必强制实现者做任何特别的事情。
您的推理是正确的,空接口不会影响程序的“标准”执行,该程序基于字段的检查/变异和方法的分派。
但是,标记接口在与反射结合使用时很有用:库/方法检查(通过反射)对象,如果其类实现标记接口,则其工作方式不同。从 Java5 开始,几乎不需要标记接口——同样的“标记”功能可以通过 Java 注释来实现——它们的大部分效果(再次)将通过基于反射的代码来实现。
主要目的是告诉编译器对实现标记接口的类的对象区别对待。
仔细查看 Java 中的标记接口,例如 Serializable、Clonnable 和 Remote,看起来它们用于向编译器或 JVM 指示某些内容。因此,如果 JVM 看到一个类是可序列化的,它会对它进行一些特殊的操作,类似地,如果 JVM 看到一个类是实现可克隆的,它会执行一些操作来支持克隆。RMI 和远程接口也是如此。所以简而言之,Marker 接口向 Compiler 或 JVM 指示、信号或命令。
阅读更多:http: //javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw