8

StackOverflow 上有几个问题讨论何时应该使用断言语句而不是抛出一些异常的问题。(示例在这里这里这里这里这里

但是,我开始怀疑断言与抛出的传统智慧是基于您在 JVM 中运行的假设。在 GWT 世界中,您的 Java 被音译为 JavaScript 并在浏览器的上下文中运行,权衡的集合感觉不同:在浏览器中运行时断言总是被编译掉,并且任何使 JavaScript 大小保持较小的东西是一个胜利,特别是如果您的 Web 应用程序必须在手机上运行。然而,断言确实在 DevMode 中运行,因此它们在开发过程中具有实用性。

所以我的问题是:有没有人考虑过一套管理如何在 GWT 中使用 assert 语句的最佳实践规则?我的团队成员问我“既然断言被编译出来,拥有它们是否有意义?”,我想为他们提供一个好的答案。

另外,是否有人对 Google 的 GWT 开发人员在此主题上的理念有任何见解?查看 GWT 源代码,他们似乎经常使用它。

4

2 回答 2

14

谷歌的常见问题解答

仅将断言用于调试目的,而不是生产逻辑,因为断言只能在 GWT 的开发模式下工作。默认情况下,它们被 GWT 编译器编译掉,因此在生产模式下没有任何影响,除非您明确启用它们。

这与您链接到的问题的答案没有任何不同。无论 Java 代码是由 javac 以通常的方式编译还是由 GWT 编译为 JavaScript,“assert”的意思是“如果这不是真的,我就有一个 bug”。相反,表单的代码

if (condition) throw new Exception(msg);

意思是“如果这是真的,那么我们将遇到程序必须处理的意外情况。”

至于没有看到断言意义的团队成员,请解释他们应该有一堆在启用断言的情况下运行的单元测试。如果测试具有良好的代码覆盖率并且它们都不会导致断言失败,那么断言语句指示的假设被证明是成立的。

于 2011-05-17T09:25:27.123 回答
4

GWT 编译器默认删除它们,但您可以根据需要保留它们。如果您认为断言在编译代码中很有用,请在调用 com.google.gwt.dev.Compiler 时添加 -ea 命令行参数。然后编译器会将 Java 断言转换为 JavaScript。

Google Web Toolkit 2.3.0
    Compiler [-logLevel level] [-workDir dir] [-gen dir] [-style style] [-ea] [-XdisableClassMetadata] [-XdisableCastChecking] [-validateOnly] [-draftCompile] [-optimize level] [-compileReport] [-strict] [-localWorkers count] [-war dir] [-deploy dir] [-extra dir] module[s] 

     ...
      -ea Debugging: causes the compiled output to check assert statements
于 2011-05-22T00:32:27.207 回答