在实现 类 时将接口的 return 值限制在一个范围内
Restrict the return value of an interface to a range in implementing classes
我正在编写一个小型库,其中有一些 interface
提供了一种方法,其中 return 值应在指定范围内。我如何才能明确禁止实现此方法的库用户使用 return 不在此范围内的值?
像这样:
//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;
}
}
和 return 这个而不是 double
但这感觉不够好,因为它是一个介于 0 和 10 之间的 double
,你想在之后使用它,而不是 DoubleBetweenZeroAndTen
.
如果无法明确禁止,确保用户不会违反的最佳方式是什么? (现在,我在 javadoc 中有一个通知。)
您不能明确禁止实现您接口的人从 whatsYourFavoriteNumberBetweenZeroAndTen()
方法返回任何 double
值。
您只能在接口的 Javadoc 中定义预期的返回值范围,作为接口定义的契约的一部分。假设您的库有 类 使用该接口的实现,如果该方法 returns 的值违反了您规定的合同,这些 类 可能会抛出异常。
这是 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
)。
我正在编写一个小型库,其中有一些 interface
提供了一种方法,其中 return 值应在指定范围内。我如何才能明确禁止实现此方法的库用户使用 return 不在此范围内的值?
像这样:
//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;
}
}
和 return 这个而不是 double
但这感觉不够好,因为它是一个介于 0 和 10 之间的 double
,你想在之后使用它,而不是 DoubleBetweenZeroAndTen
.
如果无法明确禁止,确保用户不会违反的最佳方式是什么? (现在,我在 javadoc 中有一个通知。)
您不能明确禁止实现您接口的人从 whatsYourFavoriteNumberBetweenZeroAndTen()
方法返回任何 double
值。
您只能在接口的 Javadoc 中定义预期的返回值范围,作为接口定义的契约的一部分。假设您的库有 类 使用该接口的实现,如果该方法 returns 的值违反了您规定的合同,这些 类 可能会抛出异常。
这是 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
)。