为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的标记接口?

Java中的标记接口?

ITMISS 2019-10-24 15:10:52
我被告知Java中的Marker接口是一个空接口,用于向编译器或JVM发出信号,告知实现该接口的类的对象必须以特殊方式处理,例如序列化,克隆等。但是最近我了解到它实际上与编译器或JVM无关。例如,在使用Serializable接口的情况下,的方法writeObject(Object)会ObjectOutputStream执行类似的操作instanceOf Serializable来检测类是否相应地实现Serializable和抛出NotSerializableException。一切都在代码中处理,这似乎是一种设计模式,所以我认为我们可以定义自己的标记接口。现在我的疑问:上面第一点提到的标记接口的定义是否错误?那么我们如何定义Marker接口呢?并且instanceOf为什么不使用运算符而不是使用运算符,所以为什么要使用writeObject(Serializable)编译时类型检查而不是运行时呢?注释比标记接口如何好?
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

  1. 上面第一点提到的标记接口的定义是否错误?-在以下部分中是正确的:(1)标记接口必须为空,并且(2)实现该接口意味着要对实现类进行某些特殊处理。不正确的部分是,这意味着JVM或编译器将以不同的方式对待该类的对象:您正确地观察到是Java类库的代码将这些对象视为可克隆,可序列化等。与编译器或JVM无关。

  2. 而不是使用instanceOf运算符,为什么该方法不能这样,writeObject(Serializable)以至于进行编译时类型检查 -这样可以避免在需要“普通Object” 时用标记接口的名称污染代码。例如,如果您创建一个需要可序列化并且具有对象成员的类,那么您将不得不进行强制转换或Serializable在编译时创建对象。这很不方便,因为该接口没有任何功能。

  3. 注释比标记接口如何好?-它们使您达到了将有关类的元数据传送给其使用者的相同目的,而无需为其创建单独的类型。注释也更加强大,它使程序员可以将更复杂的信息传递给“消费”它的类。


查看完整回答
反对 回复 2019-10-24
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

不能强制执行Serializable,writeObject因为不可序列化类的子级可以序列化,但是它们的实例可能被向上转换回父类。因此,持有对无法序列化的内容(例如Object)的引用并不意味着所引用的实例确实无法序列化。例如在


   Object x = "abc";

   if (x instanceof Serializable) {

   }

父类(Object)无法序列化,可以使用其无参数构造函数进行初始化。通过引用的价值x,String是序列化的条件语句将运行。


查看完整回答
反对 回复 2019-10-24
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

a /标记接口,顾名思义,仅存在于通知类的任何东西都在声明一个类。任何东西都可以是Serializable接口的JDK类,也可以是您为自定义类编写的任何类。

b /如果它是标记接口,则不应暗示存在任何方法-最好在接口中包含隐含方法。但你可以决定要设计它,只要你想,如果你知道为什么 需要它

c /空接口和不使用值或参数的注释之间几乎没有区别。但是区别在于:注释可以声明键/值的列表,这些键/值将在运行时访问。


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 476 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信