类方法的JML后处理条件是否包含对另一个方法的调用
例如,我有这样一个类:
public class A
{
public int doA(x)
{ ... }
public int doB(int x, int y)
{ ... }
}
对于doB的后置条件,我可以有:ensures doA(x) = doA(y)
吗?
是的,前提是调用的方法不包括副作用,并且声明为纯:
/@pure@/注释表示peek()是一个纯方法。A.纯方法是一种没有副作用的方法。JML只允许断言使用纯方法。我们声明peek()是纯的,这样它就可以在pop()的后置条件中使用。如果JML允许非纯方法在断言中,我们可能会无意中编写规范有副作用。这可能会导致代码在编译时正常工作启用断言检查,但在断言时不起作用检查被禁用。
http://www.ibm.com/developerworks/java/library/j-jml/index.html
public class A
{
public /*@ pure @*/ int doA(int x)
{ ... }
//@ requires ...
//@ ensures doA(x) == doA(y)
public int doB(int x, int y)
{ ... }
}