2017-06-21 57 views
4

我在寫一個小型庫,我有一些interface提供了一個返回值應該在指定範圍內的方法。我如何明確禁止實現此方法的庫的用戶返回不在此範圍內的值?將接口的返回值限制在實現類中的範圍

事情是這樣的:

//Library 
interface FavoriteNumber { 

    //returned value must lie between 0 and 10 
    double whatsYourFavoriteNumberBetweenZeroAndTen(); 
} 

... 

//Classes implemented by user of library 
class ILikePi implements FavoriteNumber { 

    @Override 
    public double whatsYourFavoriteNumberBetweenZeroAndTen() { 
     return 3.141; //Should be allowed 
    } 

} 

... 

class AnswerToLifeTheUniverseAndEverything implements FavoriteNumber { 

    @Override 
    public double whatsYourFavoriteNumberBetweenZeroAndTen() { 
     return 42; //Should be forbidden 
    } 

} 

我想我可以寫類似

class DoubleBetweenZeroAndTen { 

    private final double value; 

    DoubleBetweenZeroAndTen(double value) { 
     if (value < 0 || value > 10) { 
      throw new IllegalArgumentException("value must be between 0 and 10"); 
     } 
     this.value = value; 
    } 

    double toDouble() { 
     return this.value; 
    } 
} 

,並返回,而不是double這一點,但這種感覺並不太好,因爲它是一個double在0到10之間,你想在其後工作,而不是DoubleBetweenZeroAndTen

如果不能明確禁止,確保用戶不會違反它的最佳方法是什麼? (現在,我在javadoc中有一個通知。)

回答

1

您不能明確禁止執行界面的人返回whatsYourFavoriteNumberBetweenZeroAndTen()方法中的任何double值。

您只能在界面的Javadoc中定義返回值的預期範圍,作爲界面定義的合同的一部分。假設你的庫有使用該接口實現的類,那麼如果該方法返回的值違反了你所陳述的合同,這些類可能會拋出異常。

這是JDK的一種標準做法 - 比如,Comparatorcompare()法的合同定義了所有實現的預期行爲,以及不按合同可能導致JDK類使用實現異常或意外結果的界面(例如Collections.sort(List<T> list, Comparator<? super T> c),其Javadoc狀態可能會拋出IllegalArgumentException (optional) if the comparator is found to violate the Comparator contract)。