【问题标题】:Difference between Marker interface and empty interface?Marker接口和空接口的区别?
【发布时间】:2016-05-01 08:40:13
【问题描述】:

每个 Marker 接口都是一个空接口。反之亦然吗?

【问题讨论】:

标签: java interface marker-interfaces


【解决方案1】:

每个 Marker 接口都是一个空接口。反之亦然吗?

不。没有意义的空接口不是标记接口......在任何有用的意义上。标记接口必须对实现它的类表示有意义的

事实上,根据某些定义,(混合)标记接口可以包含方法(参见下面的 Wikipedia 定义)。所以标记界面不一定是一个空界面。


@Sudheep Vallipoyil 在他的回答中说。

1) 无法创建自定义标记界面。

我不同意。这是基于“标记界面”的狭义定义,并非普遍接受的定义。

相比之下,Wikipedia 是如何定义“标记接口”和相应的设计模式的。

“标记接口模式是计算机科学中的一种设计模式,与提供有关对象的运行时类型信息的语言一起使用。它提供了一种将元数据与该语言不明确支持此类元数据的类相关联的方法。”

"为了使用这种模式,一个类实现一个标记接口(也称为标记接口),并且与该类的实例交互的方法测试接口的存在。而典型的接口指定功能(在实现类必须支持的方法声明的形式),标记接口不需要这样做。这种接口的存在表明实现类的特定行为。混合接口,两者都充当标记和指定所需的方法是可能的,但如果使用不当可能会令人困惑。”

Joshua Bloch 的第二个定义说:

“标记接口是不包含方法声明的接口,而只是指定(或“标记”)实现该接口的类具有某些属性。”

如您所见,在正常接受的用法中,术语“标记接口”不是为 JVM 定义的接口保留的。任何人都可以定义一个。

另见:

【讨论】:

    【解决方案2】:

    首先,如果接口不包含任何成员,我们可以将其称为标记接口,它用于向 JVM 指示实现类的运行时行为。 每个空接口都不是标记接口,因为

    1)无法创建自定义标记界面

    2)你写的空接口仍然可以扩展任何其他非空接口(那么即使是空接口也有一些继承成员)。

    更好地理解就像使用标记接口的需要被使用 java 5 中的注释所取代。(通过这个你可以理解标记接口的含义)

    【讨论】:

    • 您断言不可能创建用户定义的标记界面是基于“标记界面”的狭义定义,该定义不是普遍接受的定义。
    • @StephenC 我的回答是针对什么是标记接口而不是标记接口模式是什么。我认为这就像java中的迭代器和迭代器设计模式之间的区别。我可以说不可能在java中创建用户定义的标记接口,如果你这样做,你应该能够指示jvm或者你应该能够重新编写java api。
    • 你为什么不试试看。尝试编译:“public interface MyMarker {}”。您编写/编译/使用自己的标记接口这一事实对 JVM 来说不是问题。显然,JVM 不明白MyMarker 意味着 作为标记是什么,但它并不>>需要instanceof MyMarker 并做一些事情。
    • @StephenC 我不认为如果你正在创建公共接口 MyMarker,它不是一个标记接口,它是一个空接口,而且问题是关于 2 之间的区别。然后你可以问为什么我们需要创建一个空接口。它可以是一个设计决策,例如保留某种类型以供以后修改或扩展另一个接口的中间接口。否则我们可以编写一个,因为这样做没有人会抱怨。
    • 按照 >>normalMyMarker >>is>normalBOLDED 相关部分。)通常,您会编写一些其他代码来理解它的含义,但只需指定标记接口的含义就足够了。另外,请参阅我对标记界面和空界面之间(真实!)区别的回答。这是微妙的。
    【解决方案3】:

    这个答案是对@Stephen C 的回答发表评论

    1.问题不是什么是Marker接口模式。(就像问什么是迭代器,什么是迭代器模式)

    2.wiki 定义是针对“标记接口设计模式”而不是针对 java 中的标记接口概念

    3.从 Joshua 的 Effective java 你可以找到以下标记接口的定义

    “标记接口是不包含方法声明的接口,而只是指定(或“标记”)实现该接口的类具有某些属性。”

    他还解释了为什么完整的空接口的Set(collection frame work)不是Marker接口。

    我不认为答案应该是从维基复制一些定义并解释相同的东西(这也是不相关的!)

    【讨论】:

    • 我对这个定义没有异议。我有一个论点是你的另一个答案中的这个陈述。 “无法创建用户定义的标记界面。”.到目前为止,您还没有提供任何来源来支持这一点。当然,您上面引用的 Joshua Bloch 的定义不支持它。
    • “我不认为答案应该类似于从 wiki 复制一些定义” - 引用您不理解或不理解的定义是有目的的不会承认。其目的是驳斥您答案中的(IMO)错误陈述。
    • 或者换一种说法,请根据一些公认的定义解释/证明为什么public interface MyMarker {} 不是有效的(用户定义的)标记接口。解释/证明为什么标记接口 >> 必须> 任何事物......更不用说行为了。
    • 最后,最初的问题是关于定义的;即“标记界面”一词的含义。因此,不费心引用定义的答案是……嗯……是对答案作者观点的陈述。不幸的是,在 IT 世界中,大多数定义都是(或开始)作为某人的意见。不同之处在于,广泛发表的关于术语含义的定义/观点>>倾向于
    【解决方案4】:

    你错了!!!我不知道你从哪里得到这些信息?从 java SE 7 Programmers Study Guide 中提到,“接口是一组公共方法,必须由使用接口的类实现。”接口就是接口,如果它发生了变化,我应该在上面提到的这类书籍中阅读它。如果像 Cloneable 这样的接口没有公共方法,则意味着它没有公共方法,但任何实现它的类都必须将 Object.clone() 实现为公共方法。就是这个意思!!!请不要把这么简单的事情变成复杂的讨论,尤其是在面试时!

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2019-02-03
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 2018-01-23
      • 2021-03-16
      相关资源
      最近更新 更多