2012-09-25 129 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選項昂貴的斷言。