2016-09-25 5 views
-1

OutgoingItems 클래스의 메서드는 getNextItem()hasItems()의 두 가지 메서드가 있습니다.메서드 호출의 유효성 검사 순서

현재 getNextItem()에서 hasItems() == true 인 경우 무한 루프가 진행 중입니다.

hasItems() == true의 조건을 먼저 확인하지 않으면이 메서드가 호출되지 않는다는 것을 코드에서 확인하는 방법이 있습니까?

아마도 정적 분석을위한 관련 주석이 있습니까? 구현 변경이 어렵고 변경이 필요하다고 가정합니다. 당신이 무엇을 설명

답변

0

반드시 hasItems() 사실이 아닌 이해가되지 않습니다 getNextItem()를 호출 의미 이상한 소리?

어쨌든 논리가 작동하는 방식은 동일합니다. OutgoingItems 오브젝트를 조건을 검사하는 새 클래스로 랩핑하십시오. assert으로 수표를 찍었지만 원하는대로 선택할 수 있습니다.

public class OutgoingItemsDelegate { 
    private final OutgoingItems items; 

    public OutgoingItemsDelegate(OutgoingItems items) { 
     this.items = items; 
    } 

    public boolean hasItems() { 
     return items.hasItems(); 
    } 

    public Object getNextItem() { 
     assert !items.hasItems(); 
     // alternatively you can do this: 
     // if (items.hasItems()) throw new IllegalStateException("hasItems() must not be true"); 
     return items.getNextItems(); 
    }  
} 

가이 솔루션을 지불해야 할 수도 있습니다 약간의 성능과 공간 오버 헤드는 물론이고, 이상적인 솔루션이 OutgoingItems 자체를 수정하는 것입니다,하지만 실패, 그것은 실행 가능한 옵션입니다.

* assert 문을 평가하려면 명령 줄에서 -ea 플래그를 사용해야합니다.

관련 문제