何时在客户端和通用GWT代码中使用assert

StackOverflow上有几个问题讨论了何时应该使用assert语句而不是抛出一些exception的问题。 ( 这里 , 这里 , 这里 , 这里和这里的例子。

但是,我开始怀疑assert-versus-throw的传统智慧是基于您在JVM中运行的假设。 在GWT世界中,您的Java被音译为JavaScript并在浏览器的上下文中运行,这一组权衡感觉不同:在浏览器中运行时,断言总是被编译掉,而任何使JavaScript的大小变小的东西是一个胜利,特别是如果你的网络应用程序必须在手机上运行。 断言确实可以在DevMode中运行,因此它们在开发过程中具有实用性。

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

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

谷歌的常见问题解答说

仅使用断言进行调试,而不是生产逻辑,因为断言只能在GWT的开发模式下工作。 默认情况下,它们由GWT编译器编译掉,因此除非您明确启用它们,否则在生产模式下不会产生任何影响。

这与您链接的问题的答案没有任何不同。 无论Java代码是通过javac以通常的方式编译还是由GWT编译为JavaScript,“断言”意味着“如果这不是真的我有一个错误。” 相反,forms的代码

if (condition) throw new Exception(msg); 

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

至于没有看到断言点的团队成员,请解释他们应该有一堆unit testing,这些测试在启用断言的情况下运行。 如果测试具有良好的代码覆盖率并且没有一个导致断言失败,那么断言语句指示的假设被certificate是成立的。

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