为什么断言不用于部署

时间:2011-03-02 12:38:53

标签: java assertions

为什么断言通常不用于部署? 我研究过声明公共方法参数是不合适的..但是在部署中断言私有方法参数是合适的。为什么?

3 个答案:

答案 0 :(得分:5)

默认情况下不启用断言,您必须将-ea参数传递给JVM才能启用它们。因此,在许多情况下,部署中可能只是一个简单的遗漏。其他原因可能是性能(我没有证据表明断言会明显减慢执行速度),或者是正确的错误处理,即生产系统可能认为不适合投放AssertionError

断言私有方法参数是合适的,因为您应该完全控制传递给它们的参数。公共方法OTOH是从外部世界调用的,因此您可能无法控制传递的具体参数,因此最好进行显式参数检查并适当地处理无效参数(例如,通过抛出合适的运行时异常,例如{{1} }),或者对于空引用,让JVM抛出IllegalArgumentException

答案 1 :(得分:1)

默认情况下,断言被禁用,因为开销使它们只能用于开发环境,因为它们在查找错误方面非常有用。在所有的公共方法中,你应该检查输入,而不依赖于启用的断言(-ea JVM选项),这就是为什么它们(或应该)没用。

另一方面,对于私有方法,您可以完全控制所有方法调用,这样您就可以确保提供正确的参数,但是为了能够检测到任何可能的错误而在内部断言仍然是好的尽早。

答案 2 :(得分:0)

根据开创性的书,实用的程序员,默认情况下关闭断言,因为编译器编写者已经传播了这样的想法,即性能开销是不可接受的,并且它们只在调试代码时才有用。

事实上,建议您保留断言,因为您的测试可能找不到所有错误,因为在发货时,混乱的猴子可以随时攻击。只有在遇到性能问题时才应关闭断言。

并且它还建议你应该编写自己的assert版本,当它失败时不一定会调用exit。