什么是标记界面以及它们用于什么?
答案 0 :(得分:6)
标记界面通常具有与之相关的一些魔力:直接内置到VM中,或使用反射。因为魔术在技术上可以应用于任何类,所以你使用标记来表明你对魔法的理解以及它是否适用于你的类。
答案 1 :(得分:6)
标记界面与注释的问题在Bloch的“Effective Java”中讨论,该部分的一部分可在google books here上找到
答案 2 :(得分:5)
因为有时候,如果某个类型的某个属性可以用作类型本身,那么它真的很有意义 - Serializable
会浮现在脑海中。如果我做这样的方法:
public void save(Object data){ ... }
...你真的不知道如何保存data
。 VM序列化? Bean属性序列化?一些自制计划?如果你这样写:
public void save(Serializable data){ ... }
......很明显(如果只有ObjectOutputStream
的设计师使用过这种可能性!)。当你想要将元数据添加到类型时,有时使用注释是有意义的,但在这种情况下,我会争论一个标记界面。
答案 3 :(得分:1)
用于提及类的某些属性(如Serializable显示,允许该类序列化)。现在注释可以完成这项工作。
答案 4 :(得分:0)
除了其他答案之外,标记接口还可用于指定未被其他已实现的接口继承的类的其他属性。其中一个例子是接口RandomAccess。它表示可以随意访问而不会降低性能的集合,并且不必通过迭代器访问以实现该性能。
答案 5 :(得分:0)
您可以使用标记界面标记您的类,以便向您的同事开发人员和您的类消费者说明您明确支持该功能。想想Serializable;需要持久化Session并使用序列化来执行此操作的人可以安全地使用您的类的对象。
它可以进一步用于反射;现在通常使用注释来执行此操作,但在过去,您可以检查类,检查它是否实现某个接口(如DAO),如果是,则进一步处理对象(我在这里考虑实体注释) )。
答案 6 :(得分:0)
标记接口是内部没有抽象方法的接口,它们用于为实现它们的类添加数据类型,并且是其他接口的父接口(特别是在接口中具有多个继承)
public interface name {}
public interface john1 {}
public interface john2 {}
public interface Demo extends john1 , john2 , name {}
**当JVM看到名称界面时,它会发现Demo将发挥特定的cenario。
答案 7 :(得分:0)
我还想补充一下,您可以使用标记接口来限制实例的所有权:
interface IFlumThing;
interface IFlooThing;
class BaseThing {...}
class FlumThing extends BaseThing implements IFlumThing {};
class FlooThing extends BaseThing implements IFlooThing {};
class Flum {
addThing(IFlumThing thing){...};
}
class Floo {
addThing(IFlooThing thing){...};
}