java - 为什么语言设计者允许界面包含字段?

标签 java interface constants

根据《Effective Java》中的第 19 条,必须使用接口(interface)来仅表示一种类型。在这种情况下,接口(interface)将包含构成公共(public)契约一部分的方法,该公共(public)契约由类(实现接口(interface))公开给客户端

如果是这样,为什么接口(interface)首先支持字段?由于这些字段隐式是公共(public)的、静态的、最终的(因此是常量),为什么语言设计者支持拥有它们?如果它们不受支持,那么开发人员总是会使用 utils 类(带有私有(private)构造函数)来定义这些常量。仅使用常量接口(interface)的反模式本来可以自动避免

我正在研究了解在界面中支持常量的原因。它们是与客户签订的契约(Contract)中必不可少的一部分吗?

谢谢

最佳答案

Are they essential as part of the contract with the client?

它们是否可以作为一个或多个接口(interface)方法的参数给出,或者该常量是否是一个或多个接口(interface)方法的已记录的特殊返回值。

使用接口(interface)来保存常量以便于类使用是一种反模式,并且有很多关于此的文章,但是拥有专门供接口(interface)中定义的方法使用的常量是有效的本身。

但是,使用enum类型和新的 Java 8 Optional将消除此类特殊常量的大多数用例,因此它们在现实生活中很少见。

<小时/>

例如,InputStream.read()方法全部返回 -1对于“流结束”。当然,它有很好的文档记录,但是如果 InputStream 的话,这些方法的使用不会更好地 self 记录。定义了 END_OF_STREAM常数 -1

while ((len = inputStream.read(bytes)) != InputStream.END_OF_STREAM) {

// or using a static import:
while ((len = inputStream.read(bytes)) != END_OF_STREAM) {

好吧,InputStream是一个抽象类,而不是一个接口(interface),尽管它应该是,所以不是一个完美的例子,但它说明了我试图表达的观点。

关于java - 为什么语言设计者允许界面包含字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34377258/

相关文章:

Java:接口(interface)和泛型的简单问题

抽象类中的 C# Const 字段

c++ - 在只有 const shared_ptr 的 unordered_set 中找到一个 shared_ptr?

java - 如何使用纯 Java 流式传输 mp3

java - Apache HttpClient 4.2.1 登录成功后填写表单的POST请求

interface - F# 在抽象类中部分实现接口(interface)

Java 柠檬水计算器

java - 如何以编程方式创建 Spring 计划作业?

java - 未知模式字符 'X' 从 Android 连接到 IBM Watson 对话 API 时发生异常

linux - 调用绑定(bind)时多宿主客户端主机中的源 IP