2011-11-19 31 views
3

大家好,我想知道如何将整块代码放在断言中?我们如何做一个For-Each断言?

例如,我有一个数组,我想对数组的每个值做断言。这是我的代码如下所示:

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

但是,如果我运行该程序,而不-ea由此断言被关闭,当然,循环仍然存在。

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

编辑:

哎呀宕Java是有时实在太死板,我结束了做这样的事情功能:

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

回答

4

可以使用的方法

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

嗯,我已经想到了这一点,但是这不是一个简单断言的样板代码太多吗? – Pacerier

+0

它的6行代替或3它取决于你想避免循环多少。 –

+0

当然,我们必须避免断言,如果断言关闭! – Pacerier

0

是不是真的有问题?据我所知,Java编译器和JVM忽略等待循环(空循环)。所以,从我的角度来看,并不重要,如果整个块被声明或不(最终的二进制文件应该是相同的(没有任何循环))。


编辑

这是怎么了你的测试代码看起来应该确保热点使用

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); 
    } 
} 
+0

我不认为这是真的。我测量和..证明我是对的(至少在我的机器上)。所以JVM不会忽略空循环 – Pacerier

+0

我会尝试查找一些文章。您是否尝试过多次重复该代码?有可能在“热点”重新编译之后循环被限制... – malejpavouk

+0

here:http://www.javaperformancetuning.com/news/qotm029.shtml – malejpavouk

1

的提取for循环成布尔方法,并断言其返回值。

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; 
} 
相关问题