Постусловие JML содержит вызов метода класса

Может ли постусловие JML для метода класса содержать вызов другого метода

Например, у меня есть этот класс:

public class A
{
    public int doA(x)
    { ... }

    public int doB(int x, int y)
    { ... }
}

Для постусловия doB я могу иметь: ensures doA(x) = doA(y)?

1 ответ

Решение

Да, при условии, что вызываемый метод не включает побочные эффекты и объявлен как чистый:

Комментарий /@ pure @/ указывает, что peek() является чистым методом. Чистый метод это тот, который не имеет побочных эффектов. 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)
    { ... }
}
Другие вопросы по тегам