在 Java 引入注解(在 JDK 5 中)之前,标记接口最初用于为类附加特殊含义。例如,Serializable
接口是在 JDK 1.1 中创建的。随着注解的引入,一个更好的方法——如果一个类需要被标记并且不需要额外的方法——是使用注解。
例如,与其让一个类实现Serializable
没有方法的接口,更好的方法是创建一个注解,@Serializable
然后将该注解应用到一个类(注意这@Serializable
不是JDK中包含的真正注解)。
@Serializable
public class Foo {}
有关如何创建和处理注释的更多信息,请参阅在 Java 中创建注释(请原谅我撰写了那篇文章;它包含了您需要了解的有关注释处理的信息,而不会通过直接在此处复制答案而弄乱此答案)。
另一种方法是改变标记接口背后的思维过程,而不是处理类并基于它们的标记执行操作,而是将逻辑推送到类本身。例如,与其查找类Serializable
并执行逻辑,不如将逻辑直接移动到Serializable
接口,允许客户端直接在对象上调用序列化逻辑。例如:
public interface Serializable {
public default void writeObject(ObjectOutputStream out) throws IOException {
// ... default logic ...
}
public default void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// ... default logic ...
}
public default void readObjectNoData() throws ObjectStreamException {
// ... default logic ...
}
}
那么可以直接序列化一个可序列化的对象:
public class Foo implements Serializable {}
ObjectOutputStream os = // ... some output stream
Foo foo = new Foo();
foo.writeObject(os);