2012-09-25 174 views
5

我希望计算量较小的断言始终保持打开状态,并禁用更高计算密集度的断言。实际的用例可能是当我们将代码移到生产时(根据Pragmatic Programmer,这是处理断言的建议方式)。控制Java断言 - 最佳实践

控制断言的最好方法是什么? (注意,我已经使用“-ea”在VM变量中启用了断言)。

一个简单的例子:

/** 
* 
* @precondition sizeOfList >= 2 
*/ 
private ArrayList<Integer> createSortedList(int sizeOfList){ 
    ArrayList<Integer> results = new ArrayList<Integer>(); 

    for(int i = 0; i<sizeOfList; i++){ 

     <algorithm to add sorted numbers to array> 

    } 

    if(<some_flag>) 
     assert results.get(0) < results.get(1) : "Results are not sorted."; 

    assert results.size() == sizeOfList : "Results-list size does not equal requested size."; 

    return results; 
} 

是它最好使用系统属性来控制变量?如果是这样,可以为整个项目设置系统属性,而不仅仅是一个特定的类(在Eclipse中)?

使用在“常量”类中定义的常量变量是否更好?

有没有其他方法我没有想到?

在此先感谢。

+1

您可以详细说明“计算密集程度较低”和“计算密集程度较高的断言?”之间的区别吗?也许给一个例子或两个? – allingeek

+0

一个比较密集的例子是检查一个变量,例如: 'assert i <7:“i is not less than 7”;' 更高级的comp-intensive会是需要更多的处理,像在一个列表检查每一个值的平均值: '断言AVG(listOfIntegers)<7:“平均不小于7”;' 理想情况下,将关闭高-COMP密集的断言,并留在生产中的较小的。 – mtical

回答

2

assert语句的定义特征是它可以被关闭,所以我只会将它用于不应该总是运行的断言。对于始终运行断言,我会做一些事情,如:

if (results.size() != sizeOfList) 
    throw new AssertionError("Results-list size does not equal requested size."); 

然后,您可以启用/禁用通过-ea JVM选项昂贵的断言。