【问题标题】:My team does not assert我的团队没有断言
【发布时间】:2015-07-04 11:06:23
【问题描述】:

在主要使用 Python 和 C/C++ 工作几年后,我回到了 Java。我经常在其他结构中使用asserts。今天我很难让自己不使用断言。

$ java -help 2>&1 | grep -2 "\-ea"
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity

我的团队在任何情况下都不使用-ea,所以我使用如下结构:

assert COND;
if (! COND) {
    throw new AssertionError("COND was not true");
}

我只想把assert COND;放在哪里。

经常喜欢:

assert variable != null;
if (variable == null) {
    throw new AssertionError("variable was null");
}

我只想把assert variable != null;放在哪里。

您对此有何评论或如何改进?

【问题讨论】:

  • public void assert(boolean condition, final String message) throws AssertionError {if (!cond) throw new AssertionError(message);} call as assert(some condition, "some message");跨度>

标签: java assert jvm-arguments assertion


【解决方案1】:

我的团队在任何情况下都不使用 -ea

好吧,然后改变它?将它添加到测试服务器应该不难/伤害太大。

assert COND;
if (! COND) {
    throw new AssertionError("COND was not true");
}

那些东西不一样。一个可以关闭,另一个不能。

始终强制执行的验证可用于清理不受信任的输入。

另一方面,断言只能用于防止程序员错误。

【讨论】:

    【解决方案2】:

    断言可以被禁用,因此不能保证在任何时候都处于活动状态。这可能是很少有人使用它们的原因。

    如今,单元测试已经取代了断言,因为它们运行代码以查看其行为是否符合预期。此外,@Nullable 等注释有助于 IDE 在不允许的位置捕获潜在的空指针。

    我建议询问您的团队他们希望如何完成此类检查。 Google Guava 和 Java 8 对此提供了有用的帮助方法。

    【讨论】:

    • 实际上单元测试和断言结合起来非常强大。如果您不启用断言进行测试和开发,那么在生产中启用断言是很危险的。然而,运行单元测试应该总是启用断言。
    • 断言意味着您的代码中现在有两个不同的路径。这意味着您可能会运行与测试不同的代码(断言代码可能有副作用),出于政治原因,这可能是不可接受的。
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多