提示四十一: 使用标记接口定义类型。
标记接口(marker interface),是不包含方法声明的接口,只是指定一个类实现了具有某些属性的接口。 例如,考虑 Serializable 接口,这个接口表示实现类可以序列化,它并没有特定方法,只是一种约定。可惜ObjectOutputStream.writeObject
API 没有利用Serializable 接口,如果发它的参数从Object对象改成Serializable 接口会更好,能够利用编译器在编译时进行检测。
另外一种类似的实现是标记注解,它通过注解来实现同样的功能,但是和标记接口相比,它的优点是"更大注解机制的一部分"。如果标记要适用于任何元素,不只是类和接口,则只能选择注解。如果只应用于类和接口ElementType.Type
,则要考虑标记接口。
标记接口的优点是:
标记接口定义了一个由标记类实例实现的类型;标记注解则没有定义这样的类型。这将带来编译时类型检查的好处。
标记接口可以更精确地定位目标。标记注解可以被运用在任何地方,但是标记接口可以保证所有标记类型也是适用的唯一接口的子类型。
以前开发的时候都比较注重行为,就是一定想要做些什么才会去定义一些接口、方法之类。这一章中介绍的东西更多的是一种约定,一种标记,用来表示一种共识,一种约定,比如很早就接触过的Serializable 接口。以后在开发中我要更多地关注这样的一种约定吧。