- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个后置条件,我想通过多种方法定期检查。我相当有信心我正在使用断言 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/
我想知道在像 javascript 这样的弱类型语言中,使用之间是否有显着差异 var someBool=true; if (someBool==true){ //Somecode } 或者只
我有一个后置条件,我想通过多种方法定期检查。我相当有信心我正在使用断言 correctly ,即仅检查某些内容以确保我的代码没有做任何愚蠢的事情,并且我打算在一段时间后关闭断言。但我不确定我现在写的后
我是一名优秀的程序员,十分优秀!