2017-06-21 54 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)。