限制方法参数值

时间:2014-06-30 23:59:19

标签: java methods parameters

我正在构建一个库,我的一些方法的参数应该在特定范围内。例如,在此方法中,button应介于1和3之间:

public static void pressMouse(int button){
    try{
        Robot robot = new Robot();
        if(button == 1){
            robot.mousePress(InputEvent.BUTTON1_MASK);
        }else if(button == 2){
            robot.mousePress(InputEvent.BUTTON3_MASK);
        }else{
            robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
        }
    }catch(Exception e){

    }
}

如果值无效,有没有办法抛出编译时错误? E.g。

TestLib.pressMouse(4);

我可以在方法中抛出一个异常,但如果有一个更好的方式会很酷。

2 个答案:

答案 0 :(得分:3)

不像你写的那样。但是,添加这种编译时类型检查的一种方法是使用Enum Type

public enum ButtonState {
  ONE, TWO, THREE;
  public void update(Robot robot) {
    if (robot == null) return;
    if (this == ONE) {
      robot.mousePress(InputEvent.BUTTON1_MASK);
    } else if (this == TWO) {
      robot.mousePress(InputEvent.BUTTON3_MASK);
    } else {
      robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
    }
  }
}

public static void pressMouse(ButtonState button) {
  try {
    Robot robot = new Robot();
    button.update(robot);
  } catch(Exception e) {
    e.printStackTrace();
  }
}

答案 1 :(得分:1)

对于只能在运行时知道的事情,您不能抛出编译时错误;在这种特殊情况下,方法参数的值仅在运行时 * 中已知。你可以做的是建立方法前提条件。来自Google Guava的Preconditions可以为您执行此操作:

Preconditions.checkArgument(button > 0 && button <= 3, "Button number must be between 1 and 3");

Elliott Frisch's answer是另一种可以实现此目的的方法,但它仍取决于来自已知来源的button值。也就是说,提供button值的任何人都必须将其作为ButtonState enum返回。如果不是,则必须将其转换为ButtonState,这会产生与以前相同的问题:您不能保证您将获得合法价值(除非您的来源指定它将< em>总是返回合法值。)

* 这在某些语言中理论上是可行的。例如,在Ada中,您可以指定仅对某些范围有效的整数子类型。如果事实证明使用无约束整数类型调用此方法,则编译器可以发出编译类型错误。 Java的类型系统表达能力不足(无论如何都是在编译时)。但是,您需要使用已知在此范围内的值。如果从随机源获取值,则无法保证它将在您指定的范围内。它的值只能在运行时知道。但是,编译器至少可以警告您这是可能的。在Java中,防范这种情况的最佳方法就是使用方法前置条件。但是,如果您正在使用已知的值子集并且您同时控制这些值的源和目标,那么enum就是完美的。