我正在编写一个小型库,我有一些接口提供了一个返回值应该在指定范围内的方法.我如何明确禁止实现此方法的库的用户返回不在此范围内的值?
像这样的东西:
//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之间的双重,你想要在此之后使用,而不是DoubleBetweenZeroAndTen.
如果不能明确禁止这一点,那么确保用户不会违反它的最佳方法是什么? (现在,我在javadoc中有一个通知.)
最佳答案 您不能明确禁止实现您的接口的人从whatsYourFavoriteNumberBetweenZeroAndTen()方法返回任何double值.
您只能在接口的Javadoc中定义返回值的预期范围,作为接口定义的协定的一部分.假设您的库具有使用该接口的实现的类,如果该方法返回违反您所声明的合同的值,则这些类可能会抛出异常.
这是JDK中的标准做法 – 例如,Comparator的compare()方法的契约定义了所有实现的预期行为,而不遵循契约可能导致使用接口实现的JDK类中的异常或意外结果(例如Collections.sort(List< T> list,Comparator c),如果发现比较器违反了Comparator合同,其Javadoc声明它可能抛出IllegalArgumentException(可选).