【发布时间】:2016-05-01 08:40:13
【问题描述】:
每个 Marker 接口都是一个空接口。反之亦然吗?
【问题讨论】:
标签: java interface marker-interfaces
每个 Marker 接口都是一个空接口。反之亦然吗?
【问题讨论】:
标签: java interface marker-interfaces
每个 Marker 接口都是一个空接口。反之亦然吗?
不。没有意义的空接口不是标记接口......在任何有用的意义上。标记接口必须对实现它的类表示有意义的。
事实上,根据某些定义,(混合)标记接口可以包含方法(参见下面的 Wikipedia 定义)。所以标记界面不一定是一个空界面。
@Sudheep Vallipoyil 在他的回答中说。
1) 无法创建自定义标记界面。
我不同意。这是基于“标记界面”的狭义定义,并非普遍接受的定义。
相比之下,Wikipedia 是如何定义“标记接口”和相应的设计模式的。
“标记接口模式是计算机科学中的一种设计模式,与提供有关对象的运行时类型信息的语言一起使用。它提供了一种将元数据与该语言不明确支持此类元数据的类相关联的方法。”
"为了使用这种模式,一个类实现一个标记接口(也称为标记接口),并且与该类的实例交互的方法测试接口的存在。而典型的接口指定功能(在实现类必须支持的方法声明的形式),标记接口不需要这样做。这种接口的存在表明实现类的特定行为。混合接口,两者都充当标记和指定所需的方法是可能的,但如果使用不当可能会令人困惑。”
Joshua Bloch 的第二个定义说:
“标记接口是不包含方法声明的接口,而只是指定(或“标记”)实现该接口的类具有某些属性。”
如您所见,在正常接受的用法中,术语“标记接口”不是为 JVM 定义的接口保留的。任何人都可以定义一个。
另见:
【讨论】:
首先,如果接口不包含任何成员,我们可以将其称为标记接口,它用于向 JVM 指示实现类的运行时行为。 每个空接口都不是标记接口,因为
1)无法创建自定义标记界面
2)你写的空接口仍然可以扩展任何其他非空接口(那么即使是空接口也有一些继承成员)。
更好地理解就像使用标记接口的需要被使用 java 5 中的注释所取代。(通过这个你可以理解标记接口的含义)
【讨论】:
MyMarker 意味着 作为标记是什么,但它并不>>需要instanceof MyMarker 并做一些事情。
这个答案是对@Stephen C 的回答发表评论
1.问题不是什么是Marker接口模式。(就像问什么是迭代器,什么是迭代器模式)
2.wiki 定义是针对“标记接口设计模式”而不是针对 java 中的标记接口概念
3.从 Joshua 的 Effective java 你可以找到以下标记接口的定义
“标记接口是不包含方法声明的接口,而只是指定(或“标记”)实现该接口的类具有某些属性。”
他还解释了为什么完整的空接口的Set(collection frame work)不是Marker接口。
我不认为答案应该是从维基复制一些定义并解释相同的东西(这也是不相关的!)
【讨论】:
public interface MyMarker {} 不是有效的(用户定义的)标记接口。解释/证明为什么标记接口 >> 必须> 任何事物......更不用说行为了。
你错了!!!我不知道你从哪里得到这些信息?从 java SE 7 Programmers Study Guide 中提到,“接口是一组公共方法,必须由使用接口的类实现。”接口就是接口,如果它发生了变化,我应该在上面提到的这类书籍中阅读它。如果像 Cloneable 这样的接口没有公共方法,则意味着它没有公共方法,但任何实现它的类都必须将 Object.clone() 实现为公共方法。就是这个意思!!!请不要把这么简单的事情变成复杂的讨论,尤其是在面试时!
【讨论】: