我们如何做一个For-Each断言?

时间:2011-11-19 13:47:29

标签: java assert

大家好,我想知道如何在断言中放入整个代码块?

例如,我有一个数组,我想对数组的每个值进行断言。这就是我的代码:

for (int value : values) {
    assert Within(value, x, y);
}

但是当然如果我运行没有-ea的程序,断言断言,循环仍然存在。

我想知道如何将整个循环放在断言语句中?

修改

argh dang Java有时太刻板了,我最终做了这样的功能:

assert Every(value, new F1<Boolean, Integer>() {
    Boolean Call(Integer value) {
        return Within(value, 0, 255);
    }
});

5 个答案:

答案 0 :(得分:5)

您可以使用方法

public boolean check(int... values) {
    for (int value : values) 
        if(!Within(value, x, y)) return false;
    return true;
}

assert check(values);

如果你有很多支票,另一种方法是测试断言

boolean assertEnabled = false;
assert assertEnabled = true;
if (assertEnabled) {
   // do lots of checks
}

答案 1 :(得分:4)

只需创建一个检查数组所有元素的方法:

assert allWithin(values, x, y);

...

private boolean allWithin(int[] values, int x, int y) {
    for (int value : values) {
        if (!within(value, x, y)) {
            return false;
        }
    }
    return true;
}

答案 2 :(得分:1)

将for循环解压缩为布尔方法并对其返回值进行断言。

答案 3 :(得分:1)

从 Java 8 开始,您可以选择为此使用 Stream:

assert values.stream().allMatch(value -> within(value, x, y));

(如果 values 是您示例中的数组,请改用 Arrays.stream(values)。)

答案 4 :(得分:0)

真的有问题吗?据我所知,Java编译器和JVM忽略了等待循环(空循环)。因此,从我的观点来看,无论是否断言整个块都是无关紧要的(最终的二进制文件应该是相同的(没有任何循环))。


修改

这是您的测试代码应该如何确保使用HotSpot

public static void main(String args[]) {
    int[] values = new int[10000];

    for (int i = 0; i < 1000; i++) {
        long a = System.nanoTime();
        for (int value : values);
        long b = System.nanoTime();
        System.out.println(b - a);
    }
}