根据《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/