2016-09-25 6 views
-1

OutgoingItemsという名前のクラスには、getNextItem()hasItems()という2つのメソッドがあります。メソッド呼び出しの順番の確認

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フラグを使用する必要があります。

関連する問題