与Java的断言不同,Groovy是否对生产代码提出了一个好主意?

rip*_*234 19 java groovy assert

在Java中,已知使用assert关键字通常是一个坏主意,因为它的行为依赖于运行时环境(默认情况下它不会执行任何操作,除非将-enableassertion传递给java运行时).

Groovy的主张是不同的吗?它总是在生产代码中执行,是否建议在生产代码中使用?(在Java中你会使用像Preconditions这样的东西)

从我的健全性测试来看,似乎默认情况下assert没有任何标志,并且它实际上比Java关键字更强大(参见Power Assert) - 我只是在寻找官方/完整答案,而不是我的轶事.

Dón*_*nal 22

Groovy断言总是在生产代码中执行,我建议在生产中使用.我认为以下内容大致相同,但Groovy版本更紧凑

Groovy的

assert file.exists(), "$file does not exist"
Run Code Online (Sandbox Code Playgroud)

Java的

if (!file.exists()) {
    throw new SomeRuntimeException(file + " does not exist");
}
Run Code Online (Sandbox Code Playgroud)

  • 在Groovy中使用这样的断言只适用于半字节编码*!! 失败的断言意味着违反了开发人员的假设(如:'断言x> 0:"如果$ x <= 0,则算法存在问题"'或'断言x instanceof Double:'如果这是任何事情除了Double,即将推出的代码将不可靠"').检查文件是否存在应该产生一个简单的java.io.FileNotFoundException或类似的,以便调用者可以处理该问题. (7认同)
  • 你不应该抓住`Throwable`,但如果你能从中恢复,那么捕获`AssertionError`是完全可以接受的. (4认同)
  • Groovy,这就是我的想法(双关语).当我使用它时,我越来越喜欢Groovy. (3认同)
  • 你应该注意AssertionError是一个java.lang.Error,并且不会被catch(e)捕获,你应该使用catch(Throwable e) (3认同)
  • @loteq IMO你应该很少(如果有的话)捕获断言抛出的`Throwable`,因为通常失败的断言是不可恢复的 (2认同)