Изменения
→Пример
}}
== Пример ==
Необходимо гарантировать, что данный класс будет функции данного класса будут возвращать корректные данные, либо, вообще не будет будут работать. public class Time { private int HOURShours; private int MINUTESminutes; private int SECONDSseconds; public int getHours();
{
return HOURShours;
}
public int getMinutes();
{
return MINUTESminutes;
}
public int getSeconds()
{
return SECONDSseconds;
}
public void setHours(int newHOURS);
{
}
public void setMinutes(int newMINUTES);
{
}
public void setSeconds(int newSECONDS)
{
}
}
==== Решение 1 ====
Выбрасывать исключение. Имеет недостатки: неочевидность проверки, необходимость писать кучу кода вручную.
throw GREAT_Time_Exception;
}
@Contracted // говорит о том, что класс использует контракты – для отображения в IDE
class Time
{ @Ensures ({“result >= 0”,“result <= 23” }) getHoursvoid setHours(int newHours);
{
}
@Requires ({“newHOURS>= 0”,“newHOURS<= 23” })
@Ensures (“HOURS “hours == newHOURS”)
}
@Requires – буквально означает, «Убедиться, что ДО выполнения подпрограммы («условие выполняется»)» Иначе – бросить исключение.
<tex> isEmpty - </tex> проверка на пустоту
public class ArrayStack {
private int size = 0;
private Object[] elements = new Object[2];
public void push(Object element){
assert element != null;
ensureCapacity(size + 1);
elements[size++] = element;
}
private void ensureCapacity(int capacity) {
if (capacity <= elements.length) {
return;
}
Object[] newElements = new Object[2 * capacity];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
public Object pop() {
assert size > 0;
return elements[--size];
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public Object peek() {
assert size > 0;
return elements[size - 1];
}
}
Инвариант:
Контракты: