【问题标题】:If a Marker Interface does not have any methods, how does it work?如果标记接口没有任何方法,它是如何工作的?
【发布时间】:2011-05-31 06:16:30
【问题描述】:

我知道什么是标记界面以及何时需要使用它。一个问题我还不清楚。如果标记接口没有任何方法或主体,它在运行时如何工作?

【问题讨论】:

    标签: java interface


    【解决方案1】:

    标记界面不能像这样“工作”。顾名思义,它只是将一个类标记为特定类型。其他一些代码必须检查标记的存在并根据该信息执行某些操作。

    如今,注释通常扮演与标记界面以前相同的角色。

    【讨论】:

    • 嗨,丹,如果我的理解有误,请纠正我。顾名思义,“标记”是否意味着任何类一旦实现标记接口,就意味着在运行时 JVM 将使用某种机制将此类标识为标记以实现可克隆的接口。
    • @Dan,既然您告诉"Some other code has to check for the existence of the marker and do something based on that information.".,您能否提供一个相同的示例/场景,
    • @Kamal 不,标记接口对 JVM 没有特殊意义,并且其本身不会产生额外的功能。在 Cloneable 的情况下,它只是告诉其他代码此类的开发人员保证实例是正确可克隆的。 Cloneable 可以说是标记界面被滥用的一个很好的例子。该接口应该真正强制提供公共克隆方法。
    • @Deepak 我现在想不出一个好的例子,我不会写其他不涉及标记界面的东西。标记接口并没有那么有用(对它们来说没有比 mklhmnn 演示的更多)。对CloneableSerializable 的讨论具有误导性,因为实际的克隆和序列化机制并不真正依赖于标记接口用于指示哪些类可以被克隆或序列化这一事实。
    • 回滚了对此的编辑,因为它完全改变了答案并且在我看来不是很清楚。我一般不介意编辑,但如果您想要一个完全不同的答案,请添加您自己的而不是更改我的,因为我的名字仍然列在上面。
    【解决方案2】:

    你可以用它做的唯一有用的事情是

    if (instance instanceof MyMarkerInterface) {
       ...
    }
    

    【讨论】:

      【解决方案3】:

      标记接口在很多地方都可以用注释代替,但是标记接口仍然可以用于

      • 编译时检查。您可以有一个方法,该方法必须采用具有给定标记接口的类的对象,例如

        public void myMethod(MyMarkerInterface MMI);
        

      您不能单独使用注释进行此编译时检查。

      顺便说一句:你可以有两个使用泛型的接口,但是好的例子很少。

      • 支持依赖接口来识别组件类型的框架。像 OSGi。

      编辑:我将它用于侦听器标记界面。侦听器具有标有注释的方法方法,但方法可以具有任何名称或类型。它将编译器时间检查添加到纯运行时链接。

      public Component implements Listener {
      
      @ListenerCallback
      public void onEventOne(EventOne... eventOneBatch) { }
      
      @ListenerCallback
      public void onEventTwo(EventTwo eventTwo) { }
      }
      

      【讨论】:

      • 您的myMethod 或多或少没用,因为没有比Object 更多方法的marker 接口可以做什么?
      • @MikeL。查看 java.lang.Cloneablejava.util.RandomAccess 的文档中的“好”示例(good,如 在引入注释之前我已经这样做了)。
      • @Feuermurmel 我不认为 Cloneable 是标记接口的一个很好的例子,因为不清楚为什么它没有 public Object clone() 方法。
      • @MikeL。我也不喜欢在 Java 中是如何实现克隆的,但是如果 Cloneable 声明了这样一个方法,那么如果请求了浅拷贝,那么一个类如何从自动克隆中受益呢?我将投票从Cloneable 更改为java.rmi.Remote
      【解决方案4】:

      Java中的标记接口是没有字段或方法的接口,或者简单地说Java中的空接口称为标记接口。例如可序列化、可克隆和远程接口。它们用于向编译器或 JVM 指示信号或命令。它也可以用来对代码进行分类。您还可以编写自己的标记接口,并使用它们在逻辑上划分您的代码。此外,您可以在这些类上编写任何预处理操作。

      【讨论】:

        【解决方案5】:

        标记接口告诉JVM,被标记接口标记的类添加标记接口的功能。就像实现 Cloneable 告诉 JVM 这个类实现了 Cloneable 一样,因此 JVM 必须逐位复制它。

        【讨论】:

          猜你喜欢
          • 2012-12-24
          • 2019-03-20
          • 2021-11-07
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          • 2015-07-27
          • 1970-01-01
          • 2014-09-05
          相关资源
          最近更新 更多