Я пытаюсь понять, где заканчиваются хорошие контракты и начинается паранойя. Правда, я просто не представляю, о чем должен заботиться хороший разработчик, а о чем - нет :)
Допустим, у меня есть класс, который хранит значение (значения), например java.lang.Integer. Его экземпляры агрегируются другими объектами (MappedObjects), (один ко многим или многие ко многим), и часто используются внутри методов MappedObjects. По соображениям производительности, я также отслеживаю эти отношения в TreeMap (guava MultiMap, неважно) в дополнение, чтобы иметь возможность получить быстрые итерации над MappedObjects, связанными с некоторым диапазоном Integer ключей. Итак, чтобы поддерживать систему в согласованном состоянии, я должен модифицировать метод MappedObject.bind(Integer integer) для обновления моей Map следующим образом:
class MappedObject {
public void bind (Integer integer) {
MegaMap.getInstance().remove(fInteger, this);
fInteger = integer;
MegaMap.getInstance().add(fInteger, this);
}
...
private Integer fInteger;
}
Я мог бы просто сделать абстрактный класс MappedObject с этим конечным методом, заставляя других наследоваться от него, но это грубо. Если я определю MappedObject как интерфейс с методом bind() и предоставлю скелетную реализацию -- другой разработчик может позже просто забыть включить его в объект и реализовать метод самостоятельно без обновления Map.