Programing

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

lottogame 2020. 7. 16. 08:10
반응형

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


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

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


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

후자에 먼저 응답-

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

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

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

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

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

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

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

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


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

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

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


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


왜 그런 겁니까?

더 많은 이유가 있습니다 :

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

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

덜 제공 -

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

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

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


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

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


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을 참조하십시오.

관찰자 패턴의 대안?

Observer 디자인 패턴에는 여러 가지 대안이 있으며 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을 참조하십시오.


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

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

참고 URL : https://stackoverflow.com/questions/46380073/observer-is-deprecated-in-java-9-what-should-we-use-instead-of-it

반응형