[英]Why language designers allow interface to contain fields?
根據有效Java中的第19項,必須使用一種接口來僅表示一種類型。 在這種情況下,接口將包含構成類(實現接口)公開給客戶端的公共合同的一部分的方法。
如果是這樣,為什么接口首先支持字段? 由於字段是隱式的public,static,final(因此是常量),因此語言設計者為什么支持使用它們呢? 如果它們不受支持,則開發人員將始終使用utils類(帶有私有構造函數)來定義這些常量。 本可以自動避免僅使用常量接口的反模式
我正在了解理解在接口中支持常量的原因。 作為與客戶合同的一部分,它們是否必不可少?
謝謝
原因之一可能是對於接口合同必不可少的常數。 例如,考慮以下接口:
/**
* Generates a probability distribution on a
* specified interval.
*/
public interface DistributionGenerator{
/*
* Gets a probability distribution on the specified
* interval. The exact distribution is unique to the
* implementor of this interface. The distribution will
* be represented as an array of doubles. The first number
* in the returned array will be the probability at start
* The last number will be the probability at end. All numbers
* in between will be probabilities at evenly spaced
* intervals between start and end, with the spacing between values
* given by the constant INTERVAL
*/
public double[] getDistribution(double start,double end);
public static final double INTERVAL = 0.000001;
}
但是,正如您所觀察到的,大多數時候,您會在接口中看到常量,只是為了自己的利益而公開常量,這通常被認為是不好的做法 。
作為與客戶合同的一部分,它們是否必不可少?
如果常量可以作為一個或多個接口方法的參數提供,或者常量是一個或多個接口方法的已記錄特殊返回值,則它們是它們。
使用接口來保存常量以方便類使用是一種反模式,關於它的文章很多,但是具有專門供接口本身中定義的方法使用的常量是有效的。
但是,使用enum
類型和新的Java 8 Optional
將消除此類特殊常量的大多數用例,因此在現實生活中很少見到它們。
例如, InputStream.read()
方法都為“流的末尾”返回-1
。 當然,它已經被很好地證明了,但是如果InputStream
為-1
定義了一個END_OF_STREAM
常量, 使用這些方法是否會更好地自我證明?
while ((len = inputStream.read(bytes)) != InputStream.END_OF_STREAM) {
// or using a static import:
while ((len = inputStream.read(bytes)) != END_OF_STREAM) {
好的,好吧, InputStream
是一個抽象類,而不是一個接口,盡管它本來應該是,所以不是一個完美的例子,但是它說明了我試圖提出的觀點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.