В качестве первого подхода можно подумать, что это сделано для того, чтобы позволить пользователю использовать композицию вместо наследования, что очень удобно , если ваш класс уже наследуется от другого класса , и вы не можете наследовать от Наблюдаемый класс тоже.
Но если мы посмотрим на исходный код Observable, мы увидим, что есть внутренний флаг
private boolean changed = false;
Проверяется каждый раз, когда вызывается notifyObservers:
public void notifyObservers(Object arg) {
Object[] arrLocal;
synchronized (this) {
if (!changed) return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
Но из класса, составленного этим Observable, мы не можем изменить этот флаг , поскольку он является закрытым, и методы, предоставляемые для его изменения, защищены.
Это означает, что пользователь вынужден создавать подкласс класса Observable, и я бы сказал, что отсутствие ключевого слова "abstract" является просто "ошибкой".
Я бы сказал, что этот класс - полный провал.