控制Java断言 - 最佳实践

5
我希望较少计算密集的断言始终保持开启状态,并禁用计算密集度更高的断言。一个实际应用场景是当我们将代码移动到生产环境时(根据《实用程序员》的建议,这是处理断言的建议方式)。
如何控制断言是最佳方法?(请注意,我已经在VM变量中使用“-ea”启用了断言。)
一个简单的例子:
/**
*
* @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
一个低计算强度的例子是检查变量,例如:assert i < 7 : "i不小于7";一个更高计算强度的例子是需要更多处理的东西,比如检查列表中每个值的平均值:assert avg(listOfIntegers) < 7 : "平均值不小于7。";理想情况下,在生产环境中关闭高计算强度的断言,并保留较小的断言。 - mtical
1个回答

2

assert语句的特点是可以被关闭,因此我只会用它来进行不必总是运行的断言。对于总是运行的断言,我会这样做:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接