require
和 assert
都用于在运行时执行某些检查以验证某些条件。
那么它们之间的基本区别是什么?
我看到的唯一一个是 require
抛出 IllegalArgumentException
和 assert
抛出 AssertionError
。
如何选择使用哪一个?
最佳答案
如Kigyo提到存在语义差异
- 断言意味着您的程序已达到不一致的状态,这可能是当前方法/函数的问题(我喜欢将其视为 HTTP 500 InternalServerError)
- require 意味着该方法的调用者有错误,应该修复其调用(我喜欢将其视为 HTTP 400 BadRequest)
还有一个主要的技术差异:
assert
使用 @elidable(ASSERTION)
进行注释
这意味着您可以使用 -Xelide-below ASSERTION
或使用 -Xdisable-assertions
编译程序,编译器不会生成断言的字节码。如果您有大量断言,这可以显着减少字节码大小并提高性能。
了解了这一点,您就可以使用断言
来验证程序中所有不变量各处(每个单独的前提条件/后置条件)方法/函数调用)而不是在生产中付出代价。
您通常会在启用所有断言的情况下进行“测试”构建,它会比较慢,因为它会始终验证所有断言,然后您可以进行“生产” “在没有断言的情况下构建您的产品,您将消除通过断言完成的所有内部状态检查
require
是不可省略的,在库(包括内部库)中使用它更有意义,以通知调用者调用给定方法/函数的前提条件。
关于scala - scala中的require和assert之间如何选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140757/