将接口的返回值限制为实现类的范围

时间:2017-06-21 08:34:14

标签: java interface api-design interface-implementation

我正在写一个小型库,我有一些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,但这感觉不够好,因为此后你想要使用0到10之间的double,而不是{{1 }}

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

1 个答案:

答案 0 :(得分:1)

您无法明确禁止实施界面的人返回double方法中的任何whatsYourFavoriteNumberBetweenZeroAndTen()值。

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

这是JDK中的标准做法 - 例如,Comparator compare()方法的合同定义了所有实现的预期行为,而不遵循合同可能导致使用接口实现的JDK类中的异常或意外结果(例如Collections.sort(List<T> list, Comparator<? super T> c),其Javadoc声明它可能抛出IllegalArgumentException (optional) if the comparator is found to violate the Comparator contract)。