名为OutgoingItems
的类有两种方法:getNextItem()
和hasItems()
。
在当前的实现getNextItem()
中,hasItems() == true
正在进入无限循环。
有没有办法在代码中验证除非首先检查hasItems() == true
的条件,否则不会调用此方法?
可能是静态分析的某种相关注释? 假设实施变化很难,而且人们不能做出改变。
答案 0 :(得分: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
标志。