Каков наилучший способ в Java обеспечить соблюдение инвариантов экземпляра класса (т. е. гарантировать, что определенные операторы верны прямо до и после вызова любого общедоступного метода)?
Ниже я приведу пример (тот, который заставил меня задуматься над этим вопросом), но на самом деле меня больше интересует общее решение для наложения инвариантов класса-экземпляра.
Скажем, у меня есть следующие классы:
public class Constraint
{
private int cardinality;
// constructor and getter/setter omitted
}
public class Edge
{
private int minCardinality = 1;
private int maxCardinality = Integer.MAX_VALUE;
private Constraint constraint = null;
// constructors, getters/setters and other methods omitted
}
и что я хотел бы применить следующие утверждения в классе Edge:
- 0 ‹= minCardinality ‹= maxCardinality
- если (ограничение != ноль), то (minCardinality ‹= ограничение.getCardinality() ‹= maxCardinality)
Здесь экземпляры Edge создаются парсером с установленными (обязательными) атрибутами minCardinality и maxCardinality. Атрибут ограничения (необязательный) остается пустым. Затем экземпляры передаются другому модулю (генератору тестовых кадров), который может установить или не установить ограничение с помощью метода установки.