Поскольку у нас есть интерфейсы, которые могут содержать методы по умолчанию, не лучше ли заменить Observable интерфейсом? С точки зрения функциональности Observable «делает вещь», но не «является вещью». Это должно быть изменено на интерфейс в Java 8 правильно?
Хотя это не ответ, и хотя Java 9 еще не окончательная; но в Java 9 и java.util.Observer, и java.util.Observable устарели.
- personMohamed El-Beltagy  schedule09.05.2017
Ответы (3)
arrow_upward 9 arrow_downward
Это должно быть изменено на интерфейс в Java 8 правильно?
Нет, если вы не хотите сломать всю обратную совместимость, нет. Если вы изменили его на интерфейс, то все, что написано как:
public class Foo extends Observable
был бы сломан. Я подозреваю, что это также может быть недействительным с точки зрения двоичной совместимости, но просто несовместимости исходного кода было бы достаточно, чтобы сделать его без изменений, ИМО.
Так же:
В настоящее время это конкретный класс, а не абстрактный класс... поэтому new Observable() в настоящее время допустим, но не будет интерфейсом.
Как вы сами говорите в другом ответе, реализация по умолчанию использует состояние... поэтому ее нельзя реализовать методами интерфейса по умолчанию.
personJon Skeetschedule09.11.2014
comment
Более того, такой код, как new Observable(), также сломается, если Observable станет interface. И да, это также нарушает двоичную совместимость, различие между классами и интерфейсами происходит и в байтовом коде.
- personHolger; 10.11.2014
comment
@Holger: Ах, я не знал, что это уже конкретный класс. Я думал, что это абстрактно. Добавлю это.
- personJon Skeet; 10.11.2014
comment
Я тоже не знал об этом, и это мало полезно из-за методов protected, но это обсуждалось в связанном вопросе, поэтому я узнал, что в принципе это возможно, и вы никогда не знаете, что делают кодеры. Поэтому ясно, что Oracle не нарушит совместимость даже при использовании неясного кода, если нет оправданной выгоды.
- personHolger; 10.11.2014
arrow_upward 7 arrow_downward
Это нарушит обратную совместимость, и все классы, которые расширяютObservable, будут нарушены.
personAlexRschedule09.11.2014
arrow_upward 2 arrow_downward
Я не слишком вникал в это, поэтому не понял, что
даже в Java 8 interfaces не может быть state-ful.
Observable требует, чтобы change flag и массив Observer хранились внутри и, следовательно, сохраняли состояние, а Java 8 не поддерживает это.