有人告诉我,Java 中的 Marker 接口是一个空接口,用于向编译器或 JVM 发出信号,表明实现该接口的类的对象必须以特殊的方式处理,如序列化、克隆等。
但是最近我了解到它实际上与编译器或 JVM 没有任何关系。例如,在 Serializable
接口的情况下,ObjectOutputStream
的方法 writeObject(Object)
执行类似于 instanceOf Serializable
的操作来检测类是否实现 Serializable
并相应地抛出 NotSerializableException
。
一切都在代码中处理,这似乎是一个设计模式,所以我认为我们可以定义自己的标记接口。
现在我怀疑:
上面第一点提到的标记接口的定义是错误的吗?那么我们如何定义一个标记接口呢?
为什么不使用类似于 writeObject(Serializable)
的方法来代替使用 instanceOf
操作符,这样就有了编译时类型检查而不是运行时类型检查?
注释如何比标记接口更好?