2

使用 Chromium 代码库时,我已经习惯了CHECK(condition);,DCHECK(contidtion)NOTREACHED;. 它们向代码引入断言(通常是先决条件),并允许在日志中使用一些信息终止程序,在调试构建中DCHECK,并且NOTREACHED还会停止调试器来调查案例。第一个仅在发布模式下处于活动状态,后两个仅在调试中处于活动状态 - 当“不活动”时,它们将被空宏替换并且不会造成任何开销。

Java中是否有一些库允许这样的事情?我知道我可以根据配置交换配置创建一些静态方法/对象,但我看不到避免产生开销的方法。此外,我不想重新发明轮子。

4

2 回答 2

3

您可以使用以下assert关键字:

public void yourMethod(String arg) {
    assert arg != null : "arg may not be null";
    // ...
}

这相当于

public void yourMethod(String arg) {
    if (arg == null) throw new AssertionError("arg may not be null");
    // ...
}

除非在启动 JVM 时给出了开关,否则断言将被禁用,并且在禁用-ea时将具有接近 0 的开销。

相当于NOTREACHED将是assert false;

相关:“assert”关键字有什么作用?

于 2014-12-10T18:26:12.547 回答
0

我编写了一个库来帮助编写前置条件和后置条件,并强调可读性。例如:

// Input
List<Integer> actual = Arrays.asList(2, 3, 4, 6);
List<Integer> expected = Arrays.asList(1, 3, 5);
requireThat(actual, "actual").containsAll(expected);

// Output
java.lang.IllegalArgumentException: actual must contain all elements in: [1, 3, 5]
Actual : [2, 4, 6]
Missing: [1, 5]
于 2017-04-06T15:46:12.567 回答