StackOverflow上有几个问题讨论了何时应该使用assert语句而不是抛出一些异常的问题。 (示例here,here,here,here和here。
但是,我开始怀疑assert-versus-throw的传统智慧是基于您在JVM中运行的假设。在GWT Universe中,您的Java被音译为JavaScript并在浏览器的上下文中运行,这一组权衡感觉不同:在浏览器中运行时,断言总是被编译掉,而任何使JavaScript的大小变小的东西是一个胜利,特别是如果你的网络应用程序必须在手机上运行。断言确实在DevMode中运行,因此它们在开发过程中具有实用性。
所以我的问题是:有没有人考虑过一套最佳实践规则来管理如何在GWT中使用断言语句?我有我的团队成员问我“因为断言被编译出来,拥有它们是否有意义?”,我想对他们有一个很好的答案。
此外,是否有人对Google的GWT开发人员在此主题上的理念有所了解?看看GWT源代码,他们似乎经常使用它。
答案 0 :(得分:14)
Google的FAQ说
仅将断言用于调试目的,而不是生产逻辑,因为断言只能在GWT的开发模式下工作。默认情况下,它们由GWT编译器编译掉,因此除非您明确启用它们,否则在生产模式下不会产生任何影响。
这与您链接的问题的答案没有任何不同。 Java代码是由javac以通常的方式编译还是由GWT编译为JavaScript, “断言”的意思是“如果这不是真的我有一个错误。”相比之下,形式的代码
if (condition) throw new Exception(msg);
表示“如果这是真的,那么我们就会遇到程序必须处理的意外情况。”
对于没有看到断言点的团队成员,请说明他们应该在启用断言的情况下进行一系列单元测试。如果测试具有良好的代码覆盖率并且没有一个导致断言失败,那么断言语句指示的假设被证明是成立的。
答案 1 :(得分: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