为什么我们实现标记接口,即使它们不包含任何方法?

时间:2014-01-24 08:08:30

标签: java interface marker-interfaces

我一直在考虑这个但是不能马上丢弃它,为什么即使它们不包含任何方法我们甚至会为我们的类实现Marker Interfaces。请让我知道

4 个答案:

答案 0 :(得分:3)

我们举个例子:Serializable。

如果尝试序列化对象,如果您的对象不是Serializable的实例,则Java序列化机制将抛出异常。为了使它成为Serializable的一个实例,对象的类因此必须实现Serializable接口,即使该接口不包含任何方法。就这样

o instanceof Serializable

是真的,而不是假的。

答案 1 :(得分:3)

名称建议的标记接口仅用于指示,它们标记实现该接口的类。

现在,在您的代码中,您可以对其进行一些操作,例如(instance instanceof Marker)

在大多数地方注释可用于标记

例如,如果类上的@Test显示此类是Test类并且应该执行。使用接口也可以实现同样的效果。

@Test //sort of marking
class ClassToTest{

}

class ClassToTest implements Test{

}

上述例子与他们试图实现的方式是同义词。

要检查第一种情况下的状态,您将尝试检查是否存在@Test注释,在第二种情况下,您将进行instanceof检查。

使用标记接口,您还可以获得一个优势,即如果存储了测试的所有实例,那么您可以拥有类型安全集合List<Test>,或者如果您想创建一个只接受实例的类型安全方法Test

void method(Test testInstance){

}

答案 2 :(得分:0)

对于调用者。 就像:接口A,工具B. 通常是A被调用。在Spring框架中,它很熟悉

答案 3 :(得分:0)

标记接口用作标记,以便将消息通知给java编译器,以便它可以向实现它的类添加特殊行为。

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