我被教授,Java中的Marker接口是一个空接口,用于向编译器或JVM发送信号,实现此接口的类的对象必须以特殊方式处理,如序列化,克隆等。
但最近我了解到,它实际上与编译器或JVM无关。例如,在Serializable接口的情况下,ObjectOutputStream的方法writeObject(Object)会做类似于instanceOf Serializable的事情来检测类是否实现了Serializable&相应地抛出NotSerializableException。
一切都在代码中处理,这似乎是一个设计模式,所以我想我们可以定义我们自己的标记界面。
现在我的疑惑:
>上面提到的标记接口的定义是否在第一点出错?那么我们如何定义一个Marker接口呢?
>而不是使用instanceOf操作符为什么不能的方法是类似于writeObject(Serializable),以便有一个编译时类型检查而不是运行时?
>注释如何比标记接口更好?
>上面提到的标记接口的定义是否在第一点出错? – 在以下部分是正确的:(1)标记接口必须为空,并且(2)实现意味着暗示对实现类的一些特殊处理。不正确的部分是,它意味着JVM或编译器会不同地处理该类的对象:你是正确的,观察它是Java类库的代码,将这些对象视为可克隆,可序列化等。它有与编译器或JVM无关。 >而不是使用instanceOf操作符为什么不能的方法是类似于writeObject(Serializable),以便有一个编译时类型检查 – 这让你避免污染你的代码与标记接口的名称时,一个“普通对象“是必需的。例如,如果你创建一个需要序列化的类,并且有对象成员,你将不得不在编译时强制转换或者使你的对象可序列化。这是不方便的,因为接口没有任何功能。 >注释如何比标记接口更好? – 它们允许您实现将类的元数据传达给其消费者的相同目的,而不为其创建单独的类型。注释也更强大,让程序员将更复杂的信息传递给“消耗”它的类。