답변:
왜 그런 겁니까? 더 이상 옵저버 패턴을 구현하지 않아야한다는 의미입니까?
후자에 먼저 응답-
예 , 당신이 구현하지 말아야 뜻인가Observer
와Obervable
더 이상이야.
응용 프로그램을위한 풍부한 이벤트 모델을 제공하지 않았습니다. 예를 들어, 그들은 무언가가 변했다는 개념 만지지 할 수 있었지만 변화된 것에 대한 정보는 전달하지 않았습니다.
Alex의 대답 은 Observer
약점을Observable
잘 보여줍니다 . 모든 것은 동일 합니다. instanceof
객체를 구체적인 유형으로 캐스팅하고 Observable.update()
메소드에 캐스트 하는 로직을 구현해야합니다 .
또한 인터페이스를 구현하지 않았고 모든 멤버가 비공개 이기 때문에 클래스를 직렬화 할 수없는Observable
버그가있었습니다 Serializable
.
그것에 대한 더 나은 대안은 무엇입니까?
반면에 Listeners
많은 유형이 있으며 콜백 메소드가 있으며 캐스팅이 필요하지 않습니다. @Ravi가 그의 대답 에서 지적한 것처럼 PropertyChangeListener
대신 사용할 수 있습니다 .
나머지 부분에는 @Deprecation
다른 답변과 연결된 다른 패키지를 탐색 할 수있는 적절한 문서가 표시되어 있습니다.
에 명시된 사용 중단도 분석으로 표시 한 것을 참고 이 메일 -
요즘, 이러한 문제가 발생하는 사람은 아마도
RxJava
다른 반응성 스트림 프레임 워크 를 사용하는 동안 실수로 충돌했을 것입니다 . 이 경우 사용자는 일반적으로java.util.concurrent.Flow
예정된 다음 jdk9 호환 버전 내에서 모든 반응성 스트림 프레임 워크가 호환 가능하고 상호 운용 가능해야하는 jdk9 API 를 대신 사용하려고합니다 .
편집 : API 사용 중단은 주로 위의 이유 때문이 아니라 위의 링크로 인해 발생하는 몇 가지 버그 보고서 (위의 링크)에 대한 의견에서 언급 한 레거시 코드를 유지할 수 없다는 점도 언급 할 가치가 있습니다. 하나 또는 다른 방식으로 구현 개선을 표시합니다.
Listener
또한 관찰자입니다.
예, Java 9 에서는 더 이상 사용되지 않습니다 . 그리고 더 이상 관찰자 패턴을 구현할 수 없습니다.
더 많은 이유가 있습니다 :
직렬화 불가능-Observable은 직렬화를 구현하지 않습니다. 따라서 Observable을 서브 클래스로 직렬화 할 수 없습니다.
스레드 안전성 없음 -서브 클래스로 메소드를 대체 할 수 있으며 이벤트 알림이 다른 순서로 가능하고 다른 스레드에서 발생할 수 있으며 이는 "스레드 안전성"을 방해하기에 충분합니다.
덜 제공 -
응용 프로그램을위한 풍부한 이벤트 모델을 제공하지 않습니다. 예를 들어, 그들은 무언가가 바뀌 었다는 개념 만지지하지만, 무엇이 바뀌 었는지에 대한 정보는 전달하지 않습니다
공개 된 이슈 – 언급 한 바와 같이, 많은 주요 이슈 (스레드 안전성, 직렬화 가능)가 발생했으며, 대부분 해결해야 할 복잡성이 있었으며 여전히 "고정되지 않음 "또는 활성화 되지 않았습니다 . 이것이 더 이상 사용되지 않는 이유 입니다.
또한이 답변을 읽는 것이 좋습니다 . 옵저버 패턴이 더 이상 사용되지 않는 이유는 무엇입니까? @Jeff는 지원 중단에 대한 다른 이유를 설명했습니다.
패키지 에서 사용 PropertyChangeEvent
하거나 패키지 PropertyChangeListener
에서 사용할 수 있습니다 java.beans
.
PropertyChangeListener
를 대체 Observer
하지만 대신 무엇을 확장 / 구현해야 Observable
합니까?
PropertyChangeSupport
인스턴스 변수로 추가하는 것이라고 생각 하지만 확인을 부탁드립니다.
Java 9에서 Observer가 더 이상 사용되지 않는 이유는 무엇입니까?
ANS :Observable
클래스와 Observer
이벤트 모델을 지원하기 때문에 인터페이스가 자바 (9)에서 사용되지 않습니다 Observer
및 Observable
매우 제한에 의해 전달 통지의 순서가 Observable
지정되지 않은, 그리고 상태 변경 알림과 1 대 1로 대응되지 않습니다.
Java doc https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html을 참조하십시오.
관찰자 패턴의 대안?
옵저버 디자인 패턴에는 여러 가지 대안이 있으며 Reactive Streams가 그 중 하나입니다.
반응성 스트림 또는 흐름 API :
Flow
클래스 자바 (9)에 도입 된 4 상호 인터페이스를 가지고있다 : Processor
, Publisher
, Subscriber
와 Subscription
.
Flow.Processor
: 가입자 및 게시자 역할을하는 구성 요소입니다.
Flow.Publisher
: 가입자가받는 상품 생산자.
Flow.Subscriber
: 메시지 수신자.
Flow.Subscription
: 링킹 메시지 제어 Flow.Publisher
및 Flow.Subscriber
.
Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html을 참조하십시오.
점을 감안하면 Observable
클래스와 Observer
인터페이스는 포스트 당으로 자바 (9)의로 사용되지 않습니다 JDK 9 자바의 관찰자와 관측되지 않음
Observer 및 Observable이 지원하는 이벤트 모델은 상당히 제한적이며 Observable이 제공하는 알림 순서는 지정되지 않으며 상태 변경은 알림과 일대일로 일치하지 않습니다. 더 풍부한 이벤트 모델의 경우
java.beans
패키지 사용을 고려하십시오 . 스레드간에 안정적인 순서의 메시징을 위해서는java.util.concurrent
패키지 에서 동시 데이터 구조 중 하나를 사용하십시오 . 반응 스트림 스타일 프로그래밍에 대해서는 Flow API를 참조하십시오.