如何只允许某些int值作为Java中方法的参数?

时间:2018-11-26 12:49:40

标签: java android methods parameters enums

使用两个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();
        }
    }

5 个答案:

答案 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插件,PMDChecker之类的工具,或类似的其他工具。它会分析每次发生的方法调用,并检查第一个参数是否小于第二个参数,否则,它将无法编译,甚至无法达到运行时的要求。在这种情况下绝对不值得付出努力,但是当您想大规模处理此问题(例如使用Java空值)时,这可能是一件好事。