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


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


Ответы (3)


Это должно быть изменено на интерфейс в Java 8 правильно?

Нет, если вы не хотите сломать всю обратную совместимость, нет. Если вы изменили его на интерфейс, то все, что написано как:

public class Foo extends Observable

был бы сломан. Я подозреваю, что это также может быть недействительным с точки зрения двоичной совместимости, но просто несовместимости исходного кода было бы достаточно, чтобы сделать его без изменений, ИМО.

Так же:

  • В настоящее время это конкретный класс, а не абстрактный класс... поэтому new Observable() в настоящее время допустим, но не будет интерфейсом.
  • Как вы сами говорите в другом ответе, реализация по умолчанию использует состояние... поэтому ее нельзя реализовать методами интерфейса по умолчанию.
person Jon Skeet    schedule 09.11.2014
comment
Более того, такой код, как new Observable(), также сломается, если Observable станет interface. И да, это также нарушает двоичную совместимость, различие между классами и интерфейсами происходит и в байтовом коде. - person Holger; 10.11.2014
comment
@Holger: Ах, я не знал, что это уже конкретный класс. Я думал, что это абстрактно. Добавлю это. - person Jon Skeet; 10.11.2014
comment
Я тоже не знал об этом, и это мало полезно из-за методов protected, но это обсуждалось в связанном вопросе, поэтому я узнал, что в принципе это возможно, и вы никогда не знаете, что делают кодеры. Поэтому ясно, что Oracle не нарушит совместимость даже при использовании неясного кода, если нет оправданной выгоды. - person Holger; 10.11.2014

Это нарушит обратную совместимость, и все классы, которые расширяют Observable, будут нарушены.

person AlexR    schedule 09.11.2014

Я не слишком вникал в это, поэтому не понял, что

даже в Java 8 interfaces не может быть state-ful.

Observable требует, чтобы change flag и массив Observer хранились внутри и, следовательно, сохраняли состояние, а Java 8 не поддерживает это.

person texasbruce    schedule 09.11.2014