使用两个int
parameters
(最小,最大)的库创建方法,
如果最大值大于运行时最小值,则该方法只能接受参数,这意味着当该人在编写代码时,如果该参数无效,则会在运行代码之前显示警告,因为我需要在两个值之间获取Random
号。
我从搜索中发现的是这个答案 How to only allow certain values as parameter for a method in Java?
但是似乎我无法使其与int值一起使用。
这里是我的代码:
public void call(int min, int max) throws InvalidParameterException {
if (min == (int) min) {
if (max == (int) max) {
if (max <= min) {
throw new InvalidParameterException();
} else {
Random rand = new Random();
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;
}
} else {
throw new InvalidParameterException();
}
} else {
throw new InvalidParameterException();
}
}
答案 0 :(得分:1)
您可以考虑生成自定义批注,并使用带有匹配批注的任何方法的Aspect来将其应用于验证检查。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ValidateRange{
Integer minValue();
Integer maxValue();
}
方面可以是这样的:
@Aspect
public class ValidateRangeAspect {
@Before(value = "execution(public * *(..)) && @annotation(ValidateRange)")
public void validateRange(JoinPoint joinPoint, ValidateRange validateRange) {
Integer minValue = validateRange.minValue();
Integer maxValue = validateRange.maxValue();
assertRange(getActualValueFromJoinPoint(), minValue, maxValue);
}
答案 1 :(得分:1)
尝试这种方式:
private static int getRandomIntValue(int min, int max) {
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
答案 2 :(得分:1)
我不确定我是否正确理解您,但是您的意思是这样吗?
public void call(int min, int max) throws InvalidParameterException {
if (max > min) {
Random rand = new Random();
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;
} else {
throw new InvalidParameterException();
}
}
答案 3 :(得分:1)
您可以使用Google番石榴API并在您的方法中使用它。
public void call(int min, int max) {
Preconditions.checkArgument(max > min);
// Other code here
}
如果不满足条件,该方法将抛出IllegalArgumentException。
答案 4 :(得分:1)
其他答案提到在运行时正常验证方法参数(方面),对此没有什么特别的要求。唯一要添加的是,您正在做一个技巧,当您具有浮点类型并且要检查它是否等于整数类型时,例如double == int
,将使用该技巧。通常,它总是会返回false
,这就是为什么您将double转换为int以执行实际检查的原因。因为您只有整数,所以在代码中不需要这样做,int == (int) int
完全没有必要。
您链接的答案,它提到在编译时使用枚举进行验证-在这里是不可能的,您可以创建带有很多整数值的枚举,但是请不要这样做,除非您的值范围确实有限。
想到的其他选项(因为它通常用于在代码之外的其他地方执行“魔术”操作)是注释处理,但是我认为这种用例实际上是不可能的,绝对不是以标准方式
您需要的是某种源代码分析器。诸如Intellij / Eclipse插件,PMD,Checker之类的工具,或类似的其他工具。它会分析每次发生的方法调用,并检查第一个参数是否小于第二个参数,否则,它将无法编译,甚至无法达到运行时的要求。在这种情况下绝对不值得付出努力,但是当您想大规模处理此问题(例如使用Java空值)时,这可能是一件好事。