【问题标题】:Marker Interfaces in JavaJava 中的标记接口
【发布时间】:2012-04-09 03:56:59
【问题描述】:

Java 中有标准标记接口列表吗?我已经读过(在一些 Java 书籍中)标记接口没有任何方法可以实现,但是当我进行谷歌搜索时 - 有某些答案指定标记接口确实可以有方法。如果是这样的话,那么我认为常规界面和标记界面之间没有区别 - 是否有可能消除我的困惑:)

【问题讨论】:

  • 我会说标记接口不添加任何方法。它可以为 Object 中的方法添加 Javadoc,例如为 String toString() 定义行为。
  • 您好,您的所有条目都有帮助,但不幸的是,我只能将一个标记为正确。我已经投票给其他人了。谢谢!

标签: java


【解决方案1】:

“标准”和“标记”接口之间确实没有技术区别。

通常你定义一个接口来定义实现类应该有的方法。如果您不指定任何方法,则将接口称为标记接口,因为 if 仅将类标记为具有某些属性。

例如SerializableCloneable 等。这些接口本身没有定义任何方法,但按照约定和规范,您必须选择实现一些与它们相关的特殊方法,例如一些与Serializable 相关的序列化方法。然后,如果实现了标记接口,核心 Java 库将使用反射来检查这些方法是否存在。

【讨论】:

  • 感谢 Thomas,所以技术上标记接口不会有任何方法。我说的对吗?
  • @PunterVicky 是的,pure 标记接口没有方法。正如我所说,它只是一个名称,而标记接口只是普通的旧接口,将一个类标记为具有某些属性,正如 AlexR 所说,从 Java 5 开始,您通常会为此目的使用注释。
【解决方案2】:

至少有一个:Serializable。我个人不记得其他人。 自 java 1.5 引入注解以来,定义 ta 接口的技术已经过时并且几乎已经过时,因此您可以使用注解来“标记”类而不是空接口。

【讨论】:

  • 不过,对于空接口,您可以使用注释使用不支持的 instanceOf 关键字。
  • @ShimiBandiel 好吧,你可以改用isAnnotationPresent(...)
  • 恕我直言,它比 instanceOf 更冗长。
【解决方案3】:

标记接口用作标记,向 java 编译器通知消息,以便它可以向实现它的类添加特殊行为,并且它们没有任何方法声明。

自从引入 java 注释功能后,不再需要标记接口。 更好地使用比标记接口更强大的java注解。

标记接口的一些示例:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.rmi.Remote
  • java.util.EventListener

【讨论】:

  • 另一个是:java.rmi.Remote
【解决方案4】:

SigleThreadModel 也是标记接口 - (我知道它现在已被弃用,但我只是将其名称放在这里)

查看更多信息here

【讨论】:

    【解决方案5】:

    一个接口被称为标记接口,当它被Java解释器提供为句柄来标记一个类以便它可以在运行时向它提供特殊行为并且它们没有任何方法声明时

    Java 标记接口示例

    java.lang.Cloneable
    java.io.Serializable
    java.util.EventListener
    

    【讨论】:

      【解决方案6】:

      我不知道标准Java api中有标记接口列表。我认为,标记接口是否可以指定方法在维基百科文章"Marker interface pattern" 中有很好的解释。以下是直接解决您问题的摘录:

      虽然典型的接口指定了实现类必须支持的功能(以方法声明的形式),但标记接口不需要这样做。这种接口的存在表明了实现类的特定行为。混合接口既可以作为标记,也可以指定所需的方法,但如果使用不当,可能会造成混淆。

      除了文中提到的Serializable接口外,其他的很少。我唯一记得的就是javax.security.auth.callback

      刚刚想到另一个:javax.security.auth.login.Configuration.Parameters。我很确定还有更多。

      【讨论】:

        【解决方案7】:

        Java SE 8 中的标记接口:

        使用最广泛:

        java.lang.Cloneable
        java.io.Serializable
        java.util.RandomAccess
        java.util.EventListener
        

        备注:EventListener 正式称为“标记接口”。

        其他:

        java.util.concurrent.CompletableFuture.AsynchronousCompletionTask
        java.sql.ParameterMetaData
        javax.xml.stream.events.EndDocument
        javax.management.loading.PrivateClassLoader
        java.security.KeyStore.Entry
        java.security.KeyStore.LoadStoreParameter   
        java.security.KeyStore.ProtectionParameter
        java.security.Policy.Parameters
        javax.security.auth.callback.Callback
        javax.security.auth.login.Configuration.Parameters
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-13
          • 2010-12-31
          • 2012-10-28
          • 2014-10-01
          • 2014-07-09
          • 2018-04-22
          相关资源
          最近更新 更多