【问题标题】:Why do we implement marker Interface even if they doesn't contain any methods? [duplicate]为什么我们要实现标记接口,即使它们不包含任何方法? [复制]
【发布时间】:2014-02-15 03:24:18
【问题描述】:

我一直在考虑这个但不能马上放弃它,为什么我们甚至会在我们的类中实现标记接口,即使它们不包含任何方法。请告诉我

【问题讨论】:

  • 谢谢 Anjan,下一个会检查的。
  • @Nani stackoverflow 有一个很强大的search engine

标签: java interface marker-interfaces


【解决方案1】:

我们举个例子:Serializable。

如果您尝试序列化一个对象,如果您的对象不是 Serializable 的实例,Java 序列化机制将抛出异常。为了使它成为 Serializable 的实例,对象的类因此必须实现 Serializable 接口,即使该接口不包含任何方法。就这样

o instanceof Serializable

是真的,而不是假的。

【讨论】:

    【解决方案2】:

    顾名思义,标记接口仅用于指示,它们标记实现该接口的类。

    现在您可以在您的代码中对其执行一些操作,例如 (instance instanceof Marker)

    在大多数地方注释可以用于标记

    例如,如果一个类上的@Test 显示该类是一个测试类并且应该被执行。同样可以通过接口实现。

    @Test //sort of marking
    class ClassToTest{
    
    }
    

    class ClassToTest implements Test{
    
    }
    

    上面的例子在他们试图达到的目的上是同义的。

    为了在第一种情况下检查是否存在,您将尝试检查 @Test 注释的存在,在第二种情况下,您将进行instanceof 检查。

    使用标记接口,您还可以获得一个优势,即如果您存储所有 test 实例,那么您可以拥有一个类型安全的集合 List<Test>,或者如果您想创建一个只接受 @ 实例的类型安全方法987654328@

    void method(Test testInstance){
    
    }
    

    【讨论】:

      【解决方案3】:

      对于调用者。 就像:接口A,实现B。 通常调用A。在spring框架中,很熟悉

      【讨论】:

        【解决方案4】:

        Marker 接口用作标记,将消息通知给 java 编译器,以便它可以向实现它的类添加特殊行为。

        仔细查看 Java 中的标记接口,例如Serializable、Clonnable 和 Remote 看起来它们用于向编译器或 JVM 指示某些内容。因此,如果 JVM 看到一个 Class is Serializable,它会对其进行一些特殊操作,类似地,如果 JVM 看到一个 Class 实现 Clonnable,它会执行一些操作以支持克隆。

        【讨论】:

        • 不,编译器不关心它,并且不会向实现标记接口的类添加任何行为。
        猜你喜欢
        • 2019-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        相关资源
        最近更新 更多