第37条:用标记接口定义类型
标记接口(marker interface)是没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口。 例如,Serializable接口。
标记接口有两点胜过标记注解。首先,也是最重要的一点是,标记接口定义的类型是由被标记类的实例实现的;标记注解则没有定义这样的类型。 这个类型允许你在编译时捕捉在使用标记注解的情况下要到运行时才能捕捉到的错误。
标记接口胜过标记注解的另一个优点是,他们可以被更加精确的进行锁定。如果注解类型利用@Target(ElementType.TYPE)声明,他就可以被应用到任何类或者接口。 假设有一个标记只适用于特殊接口的实现。如果将他定义成一个标记接口,就可以用它将唯一的接口扩展成他适用的接口。
标记注解胜过标记接口的最大优点在于,他可以通过默认的方法添加一个或者多个注解类型元素,给已有使用的注解类型添加更多的信息。 随着时间的推移,简单地标记注解类型可以演变成更丰富的注解类型。这种演变对于标记接口而言则是不可能的,因为他通常不能在实现接口之后再给他添加方法。
标记注解的另一个优点在于,他们是更大的注解机制的一部分。 因此,标记注解在那些支持注解作为编程元素之一的框架中同样具有以执行。
标记注解和标记接口的选择:
1.如果标记是应用到程序元素而不是类或者接口,就必须用注解;
2.如果标记只应用给类和接口,那么就标记接口优先于标记注解;
<