2012-09-25 3 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가 7보다 작지 않습니다." 더 높은 comp 집약적 인 것은 목록의 모든 값의 평균을 확인하는 것과 같은 더 많은 처리가 필요합니다. '평균은 7보다 작습니다.'; ' 이상적으로 하이 콤포 - 집중적 인 어설 션과 생산에 작은 것들에 맡겨. – mtical

답변

2

assert 문의 정의 기능은 해제 할 수 있다는 것이므로 항상 실행하지 않아야하는 어설 션용으로 만 사용합니다. 당신이 -ea JVM 옵션을 통해 고가의 주장을 활성화/비활성화 할 수 있습니다, 그리고

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

: 항상 실행 주장을 위해, 내가 좋아하는 일을 할 것입니다.