gpt4 book ai didi

java - 禁用断言的编译 Java 中,assert someBoolean(); 之间是否有区别?和 verifySomeBoolean();后者包含断言?

转载 作者:行者123 更新时间:2023-11-30 04:36:45 24 4
gpt4 key购买 nike

我有一个后置条件,我想通过多种方法定期检查。我相当有信心我正在使用断言 correctly ,即仅检查某些内容以确保我的代码没有做任何愚蠢的事情,并且我打算在一段时间后关闭断言。但我不确定我现在写的后置条件是否正是我一直想要的条件。所以我把它放入一个方法中。但后来我遇到了以下问题:

public class Foo
{
public void doSomethingRisky()
{
//...
assert someBoolean();
}

private boolean someBoolean()
{
return bar && baz;
}
}

对比

public class Foo
{
public void doSomethingRisky()
{
//...
verifySomeBoolean();
}

private void verifySomeBoolean()
{
assert bar && baz;
}
}

我知道如果我使用禁用的断言进行编译,以前的代码不会对性能造成影响,因为 someBoolean() 永远不会被调用。但是,Java 是否足够“智能”,以至于在禁用断言的情况下,第二种形式在禁用断言的情况下也不会产生性能影响?

显然,更重要的问题是哪种做法更好?

我喜欢 assert someBoolean() 因为它是明确的,不会受到重新或误解的影响,但似乎其他形式可能更适合 future ,因为也许我会想要扩展 verifySomeBoolean() 的行为,以便除了断言相同的底层 boolean 值之外还可以执行其他操作。尽管我的直觉告诉我,如果是这样的话,我最好重新编码,而不是试图将旧代码打乱以适应。智者的任何言论将不胜感激。

最佳答案

我以为你没有编译出断言?我以为它们是编译过的并且只能由 JVM 使用 java -ea 启用。

在这种情况下,当不使用 -ea 时,JVM 将由 JVM 优化空调用。但你的优化过早了。使代码易于理解和编写。然后优化第二个。调用空方法不会导致性能问题。

更新:

就风格而言,我会使用尽可能接近问题的断言。我不希望在方法中断言只是为了检查。

其次,assert() 和 Guava Preconditions 有两种不同的应用。 assert 应该用于检查您的世界是否仍然是您认为的世界。它更像是一种 assert (1+1 == 2) 类型的东西。您不在被调用者参数上使用assert()。您使用断言来检查某些您知道必须为真的东西,但无论如何都要检查它。

Guava Preconditions 看起来就是您应该使用的。这是输入验证,用于检查契约(Contract)合规性。例如:检查空参数、仅应使用自然数时的负数、格式正确的字符串等。

总之,assert() 是“让我确保重力仍然在这里,即使我知道它是”,先决条件是“让我确保我正在尝试比警察允许的速度更快”

关于java - 禁用断言的编译 Java 中,assert someBoolean(); 之间是否有区别?和 verifySomeBoolean();后者包含断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com