【问题标题】:Java assertions - second argument evaluation?Java 断言 - 第二个参数评估?
【发布时间】:2013-10-15 08:32:34
【问题描述】:

我对 Java 断言的性能很好奇。 特别是,使用 2 参数 Java 断言,如下所示:

assert condition : expression

即使“条件”的计算结果为真,“表达式”是否也会被计算?我很好奇这对于我们想要超轻量级“条件”但“表达式”可能太重(例如字符串连接)的情况是否是一个可行的解决方案。解决方案,例如Guava 中的先决条件会对表达式求值,因此在这种情况下不可行。

我的测试表明它是惰性评估的,但我找不到任何证明它的参考。

提前致谢!

【问题讨论】:

  • 您可以通过调用非void方法来测试它,该方法在调用时会打印出一条消息。
  • 是的,我测试了它,但我想要一个正式的证明——一个实现做某事的事实,不知道它是有保证的。布鲁诺的回答指向“官方”保证:)

标签: java assert


【解决方案1】:

您可以随时参考 Java 语言规范 (JLS),http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.10

简而言之,您会发现第二个表达式是惰性求值的。

我强烈建议您为 JLS 添加书签。目录在这里:http://docs.oracle.com/javase/specs/jls/se7/html/index.html。 VM 规范也可能有用(您可以在此处找到它:http://docs.oracle.com/javase/specs/jvms/se7/html/

另外,请注意,断言绝不可以替代 Guava 的前提条件(或测试前提条件的 if 语句)之类的东西。它们具有相似但不相同的目的。例如,它们可以在运行时禁用!

【讨论】:

  • 完美,这有帮助。谢谢!是的,它仅用于“开发”断言,而不是用户错误等。
  • Java 断言确实可以在运行时禁用。事实上......这是 -default- 行为。为了进行评估,必须使用 -ea 开关专门启用 Java 断言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2012-02-28
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2011-01-03
相关资源
最近更新 更多