【问题标题】:Marker Interfaces标记接口
【发布时间】:2012-10-28 09:54:16
【问题描述】:

有人能解释一下java中标记接口的合同吗?

例如:如果Clonable 是一个没有字段/方法的标记接口,那么clone() 是在哪里定义的?

为什么我们应该在使用clone() 时实现Clonable i/f?

我的问题是,如果clone() 是java.lang.Object 类的方法,为什么要实现Clonable i/f 来覆盖clone()。

有人可以详细说明一下 java 的这种约定吗?

提前致谢

【问题讨论】:

标签: java marker-interfaces


【解决方案1】:

clone() 在 java.lang.Object 类中定义,所有类都从该类扩展,但它是 protected。这实际上是一个具体的方法实现,它逐个字段地克隆对象,但前提是您已经实现了Cloneable 接口以表明这是允许的。

在实践中,许多人重写 clone() 方法,以便他们可以将其设为 public 并允许从类外部进行克隆。

这整个模式非常不寻常,不是您通常会复制的东西,我想不出在 JVM 中有许多其他示例,其中有配对的标记接口和方法。从 Java 5 开始,最好使用注解作为标记。例如@XmlRootElement 用于将类型标记为 Jax-B 可序列化(Java 5 后)与 Serializable 接口(Java 5 前)用于指示类是二进制可序列化的。

【讨论】:

    【解决方案2】:

    什么是标记界面?

    不包含任何实现方法的接口称为标记或标记接口。

    为什么要标记界面?

    具有标记接口的基本思想是提到该类正在实现其行为是隐式的接口。 该类不应该实现任何遵守接口定义的契约的东西。相反,它指示 JVM 关于隐式执行的预期功能。

    Java 示例

    • 可序列化 - 有资格序列化此类远程对象 - 这种类型是合格的远程方法调用 Clonnable - 有资格 制作实例的逐个字段副本

    我们可以创建自定义标记界面吗?

    是的,有可能。

    【讨论】:

    • 您已经发布了这个答案here。请不要多次发布相同的答案,而是将问题标记为重复。
    • 当然可以。感谢您的信息。
    【解决方案3】:

    标记接口是标记类的常用技术。它们不会向类添加行为(通常)。 Clonable 接口就是这样一个标签:每个带有Clonable 的类标签 都能够克隆自己(这是规则)。

    与Serializable 相同,尽管该标记接口背后还有一些隐藏的魔力(对象序列化程序会查找 tagged 类可能实现或不实现的一些方法和字段)

    奖励信息:忘记Clonable,它坏了。如果您想在现实生活中创建克隆,请寻找复制构造函数模式。

    【讨论】:

      【解决方案4】:

      Clonable 不包含clone() 方法,该方法在java.lang.Object 中受到保护。

      更多信息here

      引用 Josh Bloch 的 Effective Java:

      “Cloneable 接口旨在作为一个混合接口,让对象宣传它们允许克隆。不幸的是,它无法达到这个目的......这是一种非常不典型的接口使用,而不是一个可以模拟的接口。 .. 为了实现接口以对类产生任何影响,它及其所有超类必须遵守一个相当复杂、无法执行且大部分未记录的协议”

      【讨论】:

        【解决方案5】:

        java.lang.object 类是所有 java 类的超/父类, 如果你想在java中创建一个对象,那么它应该实现java.lang.object类。 如果您没有在代码中导入 Object 超类,那么编译器将在您的代码中隐式导入它。 因此,它的所有属性和行为都会自动为您提供对象(程序),包括 clone() 方法,如果您在程序中调用 clone() 方法,则意味着 clone() 方法是从超类(对象类)调用的,而不是来自子类。

        标记接口: 它真正的标记接口是空接口,它不包含属性和行为。 现在,问题可能会被提出。

        问。如果在我们的程序中使用 Predefined Marker 接口,谁来实现?

        回答:JVM 将承担这个责任,因为在 JVM 内部定义了 Marker 接口功能,因此它实现并向您添加一些高级功能是程序。

        所以程序员不需要实现Clonable Marker 接口,JVM 会承担这个责任。

        【讨论】:

          【解决方案6】:

          标记接口本身没有任何主体。它们只是要求 java 解释器以预定义的特定方式来处理扩展它们的类的对象。

          【讨论】:

          • 错误,没有。是的,它们没有方法和字段,但 java 解释器不在乎。
          猜你喜欢
          • 2018-04-22
          • 2013-06-24
          • 2012-04-09
          • 2021-07-12
          • 1970-01-01
          • 2019-11-13
          • 2011-01-05
          • 2012-04-17
          相关资源
          最近更新 更多