簡體   English   中英

為什么語言設計師允許界面包含字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM