Я бы сказал, что ваши классы должны быть разработаны для максимально простого использования.
Если вы разрешаете разработчику переопределять методы, вам определенно следует документировать контракт как можно лучше. В этом случае разработчик решает переопределить некоторые базовые функции и, следовательно, несет ответственность за обеспечение реализации, соответствующей договору.
В тех случаях, когда вы не хотите, чтобы разработчик переопределял части функциональности - по соображениям безопасности, если нет разумной альтернативы и т. Д. - просто сделайте эту часть окончательной. В вашем случае метод связывания может выглядеть так:
class MappedObject {
public final void bind (Integer integer) {
MegaMap.getInstance().remove(fInteger);
internalBind( integer );
MegaMap.getInstance().add(fInteger);
}
protected void internalBind( Integer integer ) {
fInteger = integer;
}
...
private Integer fInteger;
}
Здесь вы позволите разработчику переопределить метод internalBind()
, но убедитесь, что bind()
выполнит сопоставление.
Подводя итог: сделайте использование и расширение классов настолько простым (разумно), насколько это возможно, и не заставляйте разработчика копировать большое количество кода платформы (например, обновлений карт в вашем случае) на тот случай, если он просто захочет переопределить некоторые основные функциональность (как фактическая привязка).