我想知道为什么assert关键字在Java中如此少用?我几乎从未见过它们,但我认为它们是个好主意.我当然更喜欢简洁:
assert param != null : "Param cannot be null";
Run Code Online (Sandbox Code Playgroud)
对于冗长的:
if (param == null) {
throw new IllegalArgumentException("Param cannot be null");
}
Run Code Online (Sandbox Code Playgroud)
我怀疑是因为他们未得到充分利用
Ken*_*tle 61
理论上,断言用于测试不变量,假设必须为真才能使代码正确完成.
显示的示例是测试有效输入,这不是断言的典型用法,因为它通常是用户提供的.
断言通常不在生产代码中使用,因为存在开销,并且假设不变量失败的情况在开发和测试期间被捕获为编码错误.
你对他们"迟到"java的观点也是他们没有被广泛看到的原因.
此外,单元测试框架允许程序化断言的某些需要在被测试代码的外部.
Ada*_*icz 56
滥用断言来使用它们来测试用户输入.抛出一个IllegalArgumentException无效的输入更正确,因为它允许调用方法捕获异常,显示错误,并做任何需要(再次请求输入,退出,等等).
如果该方法是其中一个类中的私有方法,那么断言就可以了,因为您只是想确保不会意外地将它传递给null参数.您可以使用断言进行测试,当您测试了所有路径并且未触发断言时,您可以将其关闭,这样您就不会浪费资源.它们也像注释一样有用.一个assert在方法的开始是好的文档,他们应该遵循一定的前提条件的维护者,以及assert在与后置的文件到底是什么方法应该做的.它们和评论一样有用; 此外,因为断言,他们实际上测试他们记录的内容.
断言用于测试/调试,而不是错误检查,这就是为什么它们默认是关闭的:阻止人们使用断言来验证用户输入.
ycl*_*ian 18
在"Effective Java"中,Joshua Bloch建议(在"检查参数的有效性"主题中)(有点像采用的简单规则),对于公共方法,我们将验证参数并在发现无效时抛出必要的异常,并且对于非公开方法(未公开,并且您作为其用户应确保其有效性),我们可以使用断言.
YC
@Don,你很沮丧默认情况下关闭断言.我也是,因此写了这个内联它们的小javac插件(即发出字节码if (!expr) throw Ex而不是这个愚蠢的断言字节码.
如果在编译Java代码时在类路径中包含fa.jar,它将发挥其魔力然后告诉
Note: %n assertions inlined.
Run Code Online (Sandbox Code Playgroud)
@see http://smallwiki.unibe.ch/adriankuhn/javacompiler/forceassertions以及github上的https://github.com/akuhn/javac
| 归档时间: |
|
| 查看次数: |
17100 次 |
| 最近记录: |