Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Почему Observable по-прежнему является классом в Java 8?

Автор вопроса: texasbruceОтветов: 3

Связанный вопрос:

Почему java.util.Observable не является абстрактным классом? а>

Поскольку у нас есть интерфейсы, которые могут содержать методы по умолчанию, не лучше ли заменить Observable интерфейсом? С точки зрения функциональности Observable "делает вещь", но не "является вещью". Это должно быть изменено на интерфейс в Java 8 правильно?

  • Хотя это не ответ, и хотя Java 9 еще не окончательная; но в Java 9 и java.util.Observer, и java.util.Observable устарели. Mohamed El-Beltagy 09.05.2017

javajava-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 не поддерживает это.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы