Java 将接口的返回值限制在实现类中的某个范围内

Java 将接口的返回值限制在实现类中的某个范围内,java,interface,api-design,interface-implementation,Java,Interface,Api Design,Interface Implementation,我正在编写一个小型库,其中有一些接口,提供了一种返回值应在指定范围内的方法。如何明确禁止实现此方法的库用户返回不在此范围内的值 大概是这样的: //Library interface FavoriteNumber { //returned value must lie between 0 and 10 double whatsYourFavoriteNumberBetweenZeroAndTen(); } ... //Classes implemented by user

我正在编写一个小型库,其中有一些
接口
,提供了一种返回值应在指定范围内的方法。如何明确禁止实现此方法的库用户返回不在此范围内的值

大概是这样的:

//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;
    }
}
类介于零和十之间{
私人最终双重价值;
双倍介于零和十之间(双倍值){
如果(值<0 | |值>10){
抛出新的IllegalArgumentException(“值必须介于0和10之间”);
}
这个值=值;
}
双toDouble(){
返回此.value;
}
}
并返回此值,而不是
double
,但这感觉还不够好,因为它是一个介于0和10之间的
double
,而不是介于0和10之间的
double


如果无法明确禁止此操作,那么确保用户不会违反此操作的最佳方法是什么?(现在,我在javadoc中有一个通知。)

您不能明确禁止实现您的接口的人从
whatsYourFavoriteMumberbetween zero and ten()
方法返回任何
double

您只能在接口的Javadoc中定义返回值的预期范围,作为接口定义的契约的一部分。假设您的库中有使用该接口实现的类,如果该方法返回的值违反了您声明的约定,则这些类可能会引发异常

这是JDK中的一种标准做法-例如,
Comparator
compare()
方法的约定定义了所有实现的预期行为,不遵循约定可能会导致使用接口实现的JDK类(如
Collections.sort)出现异常或意外结果(清单、比较国)