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

4
我正在编写一个小型库,其中我有一些接口提供了一种方法,其返回值应该在指定范围内。如何明确禁止实现此方法的库用户返回不在此范围内的值?
类似这样:
//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,但这样做并不够好,因为之后你想要使用的是介于0和10之间的double,而不是DoubleBetweenZeroAndTen

如果无法明确禁止此操作,那么如何最好地确保用户不会违反它?(现在,在javadoc中有一个通知。)

1个回答

1

你不能明确禁止实现你的接口的人从 whatsYourFavoriteNumberBetweenZeroAndTen() 方法返回任何 double 值。

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

这是 JDK 中的标准实践 - 例如,Comparatorcompare() 方法的合同定义了所有实现的预期行为,不遵循合同可能导致在使用接口实现的 JDK 类中引发异常或意外结果(例如 Collections.sort(List<T> list, Comparator<? super T> c),其 Javadoc 指出,如果比较器违反比较器合同,则可能抛出 IllegalArgumentException(可选))。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接