2016-09-25 3 views
-1

Класс с именем OutgoingItems имеет 2 метода: getNextItem() и hasItems().Проверка порядка вызова метода

В текущей реализации getNextItem() попадает в бесконечный цикл, если hasItems() == true.

Есть ли способ проверить в коде, что этот метод не вызывается, если не было проверено условие для hasItems() == true?

Возможно, какая-то соответствующая аннотация для статического анализа? Предположим, что изменение реализации затруднено, и есть изменение, которое нельзя просто сделать.

ответ

0

Что вы описываете звучит семантически странно, конечно, вызывая getNextItem() не имеет смысла, если hasItems()не правда?

В любом случае, идея такая же, независимо от того, как работает ваша логика: оберните объекты 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 в командной строке.

Смежные вопросы