我正在构建一个库,我的一些方法的参数应该在特定范围内。例如,在此方法中,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);
我可以在方法中抛出一个异常,但如果有一个更好的方式会很酷。
答案 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
就是完美的。