【问题标题】:What is the internal implementation of marker interface?标记接口的内部实现是什么?
【发布时间】:2015-05-02 15:58:29
【问题描述】:

我对“标记界面”有所了解,标记界面没有任何成员。例如:SerialiazableCloneable 等。

我在谷歌搜索中发现标记接口用于向 JVM 发送一些指令? I want to know what are those instructions 我怎么能理解?请帮我举一个真实世界的例子。

【问题讨论】:

标签: java interface


【解决方案1】:

标记接口是一种标记类是或做某些事情的方法,甚至那些事情也不是实际的方法。例如 Serialiazable,Cloneable 等。由于引入了注释,它们几乎总是首选,尽管它们不能完全取代标记接口,正如 Joshua Bloch 所建议的那样

...您可能听说过标记注释(第 35 项)使标记 接口已过时。这种说法是不正确的。标记接口 与标记注释相比有两个优点。首先也是最重要的, 标记接口定义了一种类型,该类型由以下实例实现 标记的类;标记注释没有。这个的存在 type 允许您在编译时捕获您无法捕获的错误 如果您使用了标记注解,则捕获到运行时......

Serializable 的情况下,类实现此接口以指示其非瞬态数据成员可以写入ObjectOutputStream。此外,序列化对象需要保持跨系统的兼容性,这是一个明确的设计决策,因此需要使用标记接口来识别此类候选对象。

类似地实现 Cloneable 告诉 JVM 这个类实现了 Cloneable,因此 JVM 必须逐位复制它。

【讨论】:

  • 最后一句话表达得很草率。 '实现 Cloneable 告诉 JVM 这个类实现了Cloneable' 只是一个重言式。
【解决方案2】:

在谷歌搜索中发现标记接口用于向 JVM 发送一些指令?

没有。它们被用作其他 Java 代码的标记。

我想知道那些说明是什么

没有什么比instanceof 测试更奇特了。

【讨论】:

    【解决方案3】:

    标记接口没有实现。

    但是,标记接口通常会影响其他一些类的行为。

    我在谷歌上发现标记接口是用于向 JVM 发送一些指令的?

    这是不正确的。

    它所做的是向 JVM 或由 JVM 提供或在 JVM 上运行的类提供信息。这些信息不是“说明”的形式。相反,它是类级别的标签。

    例如,当您将一个类声明为Serializable 时,您将向ObjectInputStreamObjectOutputStream 传递该类的实例可以序列化的信息。您正在以类本身的形式传递该信息;即ObjectInputStreamObjectOutputStream 可以使用instanceof(或等效项)来测试对象是否可序列化。

    请帮我举一个真实世界的例子。

    Serializable 和 Cloneable 是 Java 类库中众所周知的示例。

    还有其他具有“类似标记接口”方面的接口。例如CloseableAutocloseable 都有一个close() 方法可以做同样的事情。不同之处在于AutoCloseable 被“try with resources”语句视为标记。

    最后,OO 设计纯粹主义者不赞成标记接口是毫无价值的。您可以使用 Java 注释来达到同样的目的。

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 1970-01-01
      • 2012-01-04
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多