Связанный вопрос:
Почему java.util.Observable не является абстрактным классом? а>
Поскольку у нас есть интерфейсы, которые могут содержать методы по умолчанию, не лучше ли заменить Observable интерфейсом? С точки зрения функциональности Observable "делает вещь", но не "является вещью". Это должно быть изменено на интерфейс в Java 8 правильно?
Ответ 1 · рейтинг 9 · Jon Skeet
Это должно быть изменено на интерфейс в Java 8 правильно?
Нет, если вы не хотите сломать всю обратную совместимость, нет. Если вы изменили его на интерфейс, то все, что написано как:
public class Foo extends Observable
был бы сломан. Я подозреваю, что это также может быть недействительным с точки зрения двоичной совместимости, но просто несовместимости исходного кода было бы достаточно, чтобы сделать его без изменений, ИМО.
Так же:
- В настоящее время это конкретный класс, а не абстрактный класс... поэтому
new Observable() в настоящее время допустим, но не будет интерфейсом.
- Как вы сами говорите в другом ответе, реализация по умолчанию использует состояние... поэтому ее нельзя реализовать методами интерфейса по умолчанию.
Ответ 2 · рейтинг 7 · AlexR
Это нарушит обратную совместимость, и все классы, которые расширяют Observable, будут нарушены.
Ответ 3 · рейтинг 2 · texasbruce
Я не слишком вникал в это, поэтому не понял, что
даже в Java 8 interfaces не может быть state-ful.
Observable требует, чтобы change flag и массив Observer хранились внутри и, следовательно, сохраняли состояние, а Java 8 не поддерживает это.