관찰자는 Java 9에서 더 이상 사용되지 않습니다. 대신에 무엇을 사용해야합니까?


133

Java 9가 나오고 Observer더 이상 사용되지 않습니다. 왜 그런 겁니까? 더 이상 옵저버 패턴을 구현하지 않아야한다는 의미입니까?

더 나은 대안이 무엇인지 아는 것이 좋을까요?

답변:


104

왜 그런 겁니까? 더 이상 옵저버 패턴을 구현하지 않아야한다는 의미입니까?

후자에 먼저 응답-

, 당신이 구현하지 말아야 뜻인가ObserverObervable더 이상이야.

더 이상 사용되지 않는 이유는 무엇입니까 ?

응용 프로그램을위한 풍부한 이벤트 모델을 제공하지 않았습니다. 예를 들어, 그들은 무언가가 변했다는 개념 만지지 할 수 있었지만 변화된 것에 대한 정보는 전달하지 않았습니다.

Alex의 대답Observer약점을Observable 잘 보여줍니다 . 모든 것은 동일 합니다. instanceof객체를 구체적인 유형으로 캐스팅하고 Observable.update()메소드에 캐스트 하는 로직을 구현해야합니다 .

또한 인터페이스를 구현하지 않았고 모든 멤버가 비공개 이기 때문에 클래스를 직렬화 할 수없는Observable 버그가있었습니다 Serializable.

그것에 대한 더 나은 대안은 무엇입니까?

반면에 Listeners많은 유형이 있으며 콜백 메소드가 있으며 캐스팅이 필요하지 않습니다. @Ravi가 그의 대답 에서 지적한 것처럼 PropertyChangeListener대신 사용할 수 있습니다 .

나머지 부분에는 @Deprecation다른 답변과 연결된 다른 패키지를 탐색 할 수있는 적절한 문서가 표시되어 있습니다.


에 명시된 사용 중단도 분석으로 표시 한 것을 참고 이 메일 -

요즘, 이러한 문제가 발생하는 사람은 아마도 RxJava다른 반응성 스트림 프레임 워크 를 사용하는 동안 실수로 충돌했을 것입니다 . 이 경우 사용자는 일반적으로 java.util.concurrent.Flow예정된 다음 jdk9 호환 버전 내에서 모든 반응성 스트림 프레임 워크가 호환 가능하고 상호 운용 가능해야하는 jdk9 API 를 대신 사용하려고합니다 .

편집 : API 사용 중단은 주로 위의 이유 때문이 아니라 위의 링크로 인해 발생하는 몇 가지 버그 보고서 (위의 링크)에 대한 의견에서 언급 한 레거시 코드를 유지할 수 없다는 점도 언급 할 가치가 있습니다. 하나 또는 다른 방식으로 구현 개선을 표시합니다.


3
+1. 좋은 대답이지만 여전히 이해하려고 노력하고 있습니다. 디자인 패턴 자체의 고유 한 문제 (GOF에서 책에 정의 된대로) 또는 Java의 패턴 지원 문제로 인해 Java의 Observer가 더 이상 사용되지 않습니까? C #, C ++, Python과 같은 다른 OO 언어에서는 옵저버 디자인 패턴에 Java와 동일한 문제가 있습니까?
Tim

25
특정 구현이 더 이상 사용되지 않는다고해서 Observer 패턴 에 치명적인 결함이있는 것은 아닙니다 . Listener또한 관찰자입니다.
chrylis-신중하게 낙관적-9

@chrylis 감사합니다. 더 이상 동의 할 수 없었습니다. API를 더 이상 사용하지 않는 주된 이유 중 하나는 API에 첨부 된 유지 관리이기도하며 구현 변경으로 인해 다른 코드가 손상되었을 수 있습니다.
Naman

@ curious95 거기에 동시 알림 방법 을 이해할 수 없습니다.
Naman

4
@ curious95 네, notifyObservers()동시 통화 입니다. 다음은 동일한 기능 의 코드 렛 으로 기능을 자세히 설명합니다.
Naman

37

예, Java 9 에서는 더 이상 사용되지 않습니다 . 그리고 더 이상 관찰자 패턴을 구현할 수 없습니다.


왜 그런 겁니까?

더 많은 이유가 있습니다 :

직렬화 불가능-Observable은 직렬화를 구현하지 않습니다. 따라서 Observable을 서브 클래스로 직렬화 할 수 없습니다.

스레드 안전성 없음 -서브 클래스로 메소드를 대체 할 수 있으며 이벤트 알림이 다른 순서로 가능하고 다른 스레드에서 발생할 수 있으며 이는 "스레드 안전성"을 방해하기에 충분합니다.

덜 제공 -

응용 프로그램을위한 풍부한 이벤트 모델을 제공하지 않습니다. 예를 들어, 그들은 무언가가 바뀌 었다는 개념 만지지하지만, 무엇이 바뀌 었는지에 대한 정보는 전달하지 않습니다

공개 된 이슈 – 언급 한 바와 같이, 많은 주요 이슈 (스레드 안전성, 직렬화 가능)가 발생했으며, 대부분 해결해야 할 복잡성이 있었으며 여전히 "고정되지 않음 "또는 활성화 되지 않았습니다 . 이것이 더 이상 사용되지 않는 이유 입니다.

또한이 답변을 읽는 것이 좋습니다 . 옵저버 패턴이 더 이상 사용되지 않는 이유는 무엇입니까? @Jeff는 지원 중단에 대한 다른 이유를 설명했습니다.


그래서 우리가 가진 대안은 무엇입니까?

패키지 에서 사용 PropertyChangeEvent하거나 패키지 PropertyChangeListener에서 사용할 수 있습니다 java.beans.


PropertyChangeListener를 대체 Observer하지만 대신 무엇을 확장 / 구현해야 Observable합니까?
LastStar007

업데이트 : 접근 방식은 PropertyChangeSupport인스턴스 변수로 추가하는 것이라고 생각 하지만 확인을 부탁드립니다.
LastStar007

3
@ LastStar007 당신이 옳다고 생각합니다. Baeldung.com 에서 코드 샘플을 찾았습니다 .
Dragos Stanciu

13

Java 9에서 Observer가 더 이상 사용되지 않는 이유는 무엇입니까?

ANS :Observable 클래스와 Observer이벤트 모델을 지원하기 때문에 인터페이스가 자바 (9)에서 사용되지 않습니다 ObserverObservable매우 제한에 의해 전달 통지의 순서가 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, SubscriberSubscription.

Flow.Processor : 가입자 및 게시자 역할을하는 구성 요소입니다.

Flow.Publisher : 가입자가받는 상품 생산자.

Flow.Subscriber : 메시지 수신자.

Flow.Subscription: 링킹 메시지 제어 Flow.PublisherFlow.Subscriber.

Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html을 참조하십시오.


7

점을 감안하면 Observable클래스와 Observer인터페이스는 포스트 당으로 자바 (9)의로 사용되지 않습니다 JDK 9 자바의 관찰자와 관측되지 않음

Observer 및 Observable이 지원하는 이벤트 모델은 상당히 제한적이며 Observable이 제공하는 알림 순서는 지정되지 않으며 상태 변경은 알림과 일대일로 일치하지 않습니다. 더 풍부한 이벤트 모델의 경우 java.beans 패키지 사용을 고려하십시오 . 스레드간에 안정적인 순서의 메시징을 위해서는 java.util.concurrent패키지 에서 동시 데이터 구조 중 하나를 사용하십시오 . 반응 스트림 스타일 프로그래밍에 대해서는 Flow API를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.