它介于偏好问题和惯例问题之间。
一般人们会用断言来表示编程错误;也就是说,“如果我的工作做得对,那么无论用户输入或其他外部力量如何,非空值param
都不会导致 -1 from 。” get
我几乎将它们视为可以在运行时选择性地验证的注释。
另一方面,如果get
在某些情况下可能返回 -1,但该输入无效,那么我通常会抛出一个IllegalArgumentException
, 并且checkArgument
是一种完全合理的方法。这样做的一个缺点是,当你后来发现它时,它可能来自几乎任何地方。考虑:
try {
baz();
bar();
foo(myInput);
} catch (IllegalArgumentException e) {
// Where did this come from!?
// It could have come from foo(myInput), or baz(), or bar(),
// or some method that any of them invoked, or really anywhere
// in that stack.
// It could be something totally unrelated to user input, just
// a bug somewhere in my code.
// Handle it somehow...
}
在这很重要的情况下——例如,您想向用户弹出一个有用的注释,说明他们不允许-1
在输入表单中输入——您可能需要抛出一个自定义异常,以便您可以更轻松地捕获后来:
try {
baz();
bar();
foo(myInput);
} catch (BadUserInputException e) {
reportError("Bad input: " + e.getMessage());
log.info("recorded bad user input", e);
}
至于checkState
,对我来说听起来不太对劲。该异常通常意味着问题出在所处的状态this
(或应用程序中的某个其他更全局的状态)。从文档:
表示方法已在非法或不适当的时间被调用。
在您的情况下, -1 永远不合适,因此checkState
具有误导性。现在,如果它是:
if (x == -1 && (!allowNegativeOne()) { ... }
...那会更合适,尽管它仍然具有上述缺点IllegalArgumentException
。
所以,最后,有一个问题是你应该保持if
原样,还是使用辅助方法。这真的归结为口味,检查的复杂程度以及使用频率(例如在其他方法中)。如果检查很简单,x == -1
并且其他方法从未执行过检查(因此代码重用不是问题),我只会保留if
.