Java 无方法/常数定义的接口用途

Java 无方法/常数定义的接口用途,java,Java,我是Java的新手。 我能够编译以下接口,没有任何错误 文件名:empty\u interface.java 文件内容: public interface empty_interface {} 问题 a) 接口,我相信,是实现者必须实现的契约。如果扩展了上述接口,实现者将实现什么 b) 可能与a有关)…但我想问一下…为什么编译器会允许未定义的接口成功编译?该接口不是未定义的,只是没有为其定义任何方法 空接口通常用作类是否支持某些行为的标志 这是否是一个好模式还存在争议,实践中的一个好例子是,和

我是Java的新手。 我能够编译以下接口,没有任何错误

文件名:
empty\u interface.java

文件内容:

public interface empty_interface {}
问题

a) 接口,我相信,是实现者必须实现的契约。如果扩展了上述接口,实现者将实现什么


b) 可能与a有关)…但我想问一下…为什么编译器会允许未定义的接口成功编译?

该接口不是未定义的,只是没有为其定义任何方法

空接口通常用作类是否支持某些行为的标志

这是否是一个好模式还存在争议,实践中的一个好例子是,和。Cloneable让您知道实现它的类可以通过
Object.clone
克隆,而Serializable让您知道实现类允许序列化


我个人认为这没什么错。

空接口是标记接口,满足多个角色

序列化需要实现
Serializable
的类的实例。接口存在的唯一原因是在不存在时标记出不可序列化的类(以及开发人员不关心序列化的类),并让自己的类的开发人员考虑他们的类是否可序列化

奇怪的是,
Serializable
提到了几个可选方法

另一个假设有效但不是很有用的用法是接受多个不相关的类,而不接受所有的类。

JDK中已经有许多“标记”接口。这仅仅意味着一些不需要方法的东西

最常见的示例是Serializable,它表示类可以序列化。库完成了其余部分,因此不需要其他方法

一个模糊的是RandomAccess,它意味着可以以有效的方式随机访问列表。Collections.sort()使用它

另一个类是Cloneable,它是一个标记接口,但可能应该有一个方法

public Object clone();
自Java5.0以来,添加这样的元信息的更好方法是使用注释,但这些注释以前不可用


<>这是Jon Skeet对类似问题的极好回答:“P”>把界面命名为IFOO,更多的是C++的东西,出于好奇?是的。我最近开始这样命名我的界面,因为它帮助我更容易找到它们哈哈…啊,我明白了。我必须尝试这样做来帮助我的组织。是的,我确信关于它是否是一种好的做法存在争议,但我个人喜欢它。有时很难保持文件名的正确性。@williammerrison是的,根据一些人的说法,如果你能想出一个完美的描述性名称,并在其中添加一个
I
,这是唯一不好的做法。更准确地说,它的存在是为了指出可序列化的类,而不是相反:)当然,这两者都有。@Keyser是的,但是隐含的意思是,开发人员在序列化方面忽略了类sans interface,或者是完全不可序列化的类sans interface。请注意,java中的命名约定将为接口命名为
EmptyInterface
,或者类似的名称。