注解-Java中标记接口的用途是什么?
当标记接口(如Serializable)中没有实现的对象时。 。 实施它有什么用?
9个解决方案
85 votes
Joshua Bloch:有效的Java 2nd Edition,第179页
条目37:使用标记界面定义类型
... 您可能会听到说标记 注释(项目35)做标记 接口已过时。 这个断言是 不正确 标记接口有两个 相对于标记注释的优势。 首先,标记界面 定义由以下对象实现的类型 标记类的实例; 记号笔 注释没有。 存在的 这种类型可以让您捕获错误 在编译时,您无法 直到运行时才捕获 标记注释...
就我个人而言,我认为我将向约书亚(Joshua)在该主题上的丰富知识致敬。
T C answered 2020-01-17T22:59:21Z
61 votes
在Java的早期版本中,标记接口是声明有关类的元数据的唯一方法。 例如,可序列化标记接口使类的作者可以说,他们的类在进行序列化和反序列化时将表现正确。
在现代Java中,标记接口没有位置。 注释可以完全替换它们,从而提供非常灵活的元数据功能。 如果您具有有关类的信息,并且该信息永不更改,则注释是表示它的非常有用的方法。
Chris Pitman answered 2020-01-17T22:58:47Z
6 votes
在其他代码根据对象是否实现某些标记接口进行决策的情况下,此类标记接口很有用。
对于Serializable,将使用反射序列化对象的字段。
现在,注释是首选的,因为它们不会传播到子类。
请参见标记器界面模式。
Gregory Pakosz answered 2020-01-17T22:59:55Z
4 votes
它表明该类(因此不是瞬态的所有字段)是序列化的候选对象。 而且,如果您要构建依赖于序列化的框架,则当然可以这样编写一种方法:
public void registerObject(Serializable obj);
限制您准备接受的课程。
因为序列化的对象需要保持跨系统的兼容性,所以序列化是一个明确的设计决策,因此需要使用标记接口来标识这些候选对象。
还有一个安全方面。 您不想使所有内容都可序列化-否则您可能会意外地通过序列化公开(例如)密码或其他敏感数据。
Brian Agnew answered 2020-01-17T23:00:28Z
3 votes
如果实现接口,则instanceof为true。 如果您的接口没有什么可实现的,则可以使用它来标记带有元数据的类,例如Java 1.5及更高版本的注释,而不必强制实现者执行任何特殊操作。
cyborg answered 2020-01-17T23:00:49Z
3 votes
它们称为标记器接口。 顾名思义,它们标记某些对象可用于某些类型的操作。
Serializable表示该对象符合Java序列化的条件。
由于它们的功能非常相似,因此已经讨论了是否不应该将它们替换为注释。
Bozho answered 2020-01-17T23:01:18Z
1 votes
您的推理是正确的,一个空接口不会影响基于字段检查/更改和方法分派的程序的“标准”执行。
但是,将标记接口与反射结合使用时非常有用:库/方法(通过反射)检查对象,并且如果其类占用标记接口,则工作方式会有所不同。 从Java5开始,几乎不需要标记接口-通过Java注释可以实现相同的“标记”功能-(再次)它们的大部分效果将通过基于反射的代码来实现。
Itay Maman answered 2020-01-17T23:01:43Z
-2 votes
仔细查看Java中的标记接口,例如 可序列化,可克隆和远程,看起来它们用于指示编译器或JVM。 因此,如果JVM看到某个类可序列化,则它对它执行了一些特殊的操作;如果JVM看到一个类实现了Clonnable,则它执行了一些操作来支持克隆。 RMI和远程接口也是如此。 因此,简而言之,Marker接口向Compiler或JVM指示,发出信号或发出命令。
阅读更多:[http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw]
user3293519 answered 2020-01-17T23:02:08Z
-3 votes
主要目的是告诉编译器对实现标记接口的类的对象进行不同的处理。
Chanikag answered 2020-01-17T23:02:28Z