관찰자는 자바 9에서 더 이상 사용되지 않는다.그거 말고 뭘 쓸까?
Java 9가 나왔고, 더 이상 사용되지 않았다.왜 그런 것일까요?관찰자 패턴을 더 이상 구현해서는 안 된다는 뜻인가?
무엇이 더 나은 대안인지 아는 것이 좋을까?
왜 그런 것일까요?관찰자 패턴을 더 이상 구현해서는 안 된다는 뜻인가?
후단에 먼저 대답 -
그렇다, 그것은 당신이 실행하지 말아야 한다는 것을 의미한다.Observer
그리고Obervable
s 더 이상.
그들은 애플리케이션을 위한 충분한 이벤트 모델을 제공하지 않았다.예를 들어, 그들은 무언가가 변했다는 생각만을 지지할 수 있을 뿐, 무엇이 변했는지에 대한 어떠한 정보도 전달하지 않았다.
알렉스의 대답은 모든 것이 똑같다는 단점을 가지고 있다는 것을 아주 솔직하게 표현한다.에 근거한 논리를 구현해야 한다.instanceof
그리고 물체를 구체적인 유형으로 주조하여Observable.update()
방법의
게다가 수업을 시행하지 않아 연재할 수 없는 버그도 있었다.Serializable
인터페이스와 모든 구성원은 비공개였다.
그것에 대한 더 나은 대안은 무엇인가?
다른 한편으로는Listeners
종류도 많고 콜백 방식도 있어 캐스팅이 필요 없다.그의 대답에서 @Ravi가 지적한 바와 같이 당신은 대신 사용할 수 있다.
남은 기간 동안@Deprecation
다른 답변에서도 연결된 것처럼 다른 패키지를 탐색할 수 있는 적절한 문서로 표시되었다.
이 메일에서 언급된 바와 같이, 사용불가에도 분석 표시가 되어 있다는 점에 유의하십시오.
요즘 이런 일을 접하는 사람은 누구나 아마 사용하다가 실수로 때리고 있을 것이다.
RxJava
또는 다른 반응형 스트림 프레임워크.이 경우 사용자는 일반적으로 jdk9를 대신 사용하기를 원할 것이다.java.util.concurrent.Flow
모든 사후 대응형 스트림 프레임워크가 예정된 예정된 jdk9 호환 버전 내에서 호환/호환 가능해야 하는 API
편집: API의 사용이 저하된 것은 단순히 위의 이유 때문만이 아니라, (위에서 링크된) 버그 보고서 중 몇 개의 코멘트에 언급된 것과 같은 레거시 코드를 유지할 수 없기 때문이라는 것도 언급할 필요가 있다.
더 많은 이유가 있다:
직렬화 가능하지 않음 - 관측 가능은 직렬화 가능을 구현하지 않기 때문에따라서, 관측 가능한 하위 클래스 둘 다 직렬화할 수 없다.
No Thread Safety - 방법은 하위 클래스에 의해 재정의될 수 있으며, 이벤트 알림은 다른 순서와 다른 스레드에서 발생할 수 있으므로 "스레드 안전"을 방해하기에 충분하다.
그들은 응용 프로그램을 위한 충분한 이벤트 모델을 제공하지 않는다.예를 들어, 그들은 단지 무언가가 변했다는 개념만을 지지하지만, 무엇이 변했는지에 대해서는 어떠한 정보도 전달하지 않는다.
개방적인 문제 - 언급했듯이 (안전성, 직렬화 가능) 많은 주요 문제들이 제기되었고, 그 중 대부분은 수정해야 할 복잡성과 여전히 "고정되지 않음" 또는 "활성적 개발 없음"을 가지고 있었으며, 이것이 바로 그것이 불용된 이유다.
나는 또한 이 대답을 읽기를 권하고 싶다.왜 관찰자 패턴은 더 이상 사용되지 않아야 하는가? @Jeff는 더 이상 더 이상 더 이상 사용되지 않는 이유를 설명했다.
그래서, 우리가 할 수 있는 대안이 뭐가 있지?
패키지와 패키지에서 사용할 수 있다.
왜 Observer가 Java 9에서 더 이상 사용되지 않는가?
앤스: 더Observable
계급과 계급Observer
Java 9에서 인터페이스가 더 이상 사용되지 않는 이유는 이벤트 모델이 에 의해 지원되기 때문이다.Observer
그리고Observable
에 의해 전달되는 통지 순서는 상당히 제한적이다.Observable
지정되지 않았으며 주의 변경사항은 알림과 일대일 대응으로 수행되지 않는다.
Java 문서 https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html을 참조하십시오.
관찰자 패턴 대체?
옵저버 설계 패턴에는 많은 대안이 있으며, 반응형 스트림도 그 중 하나이다.
반응형 스트림 또는 Flow API:
Flow
Java 9에 도입된 클래스로서 4개의 상호 관련 인터페이스가 있다.Processor
Publisher
Subscriber
그리고Subscription
.
Flow.Processor
: 구독자 및 게시자 역할을 모두 수행하는 구성 요소.
Flow.Publisher
구독자가 받은 항목의 생산자.
Flow.Subscriber
메시지 수신기.
Flow.Subscription
: a를 연결하는 메시지 제어Flow.Publisher
그리고Flow.Subscriber
.
Java 문서 https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html을 참조하십시오.
을 고려한다면Observable
계급과 계급Observer
Java 9에서는 인터페이스가 더 이상 사용되지 않는다.포스트 Java's Observer and Observable Ares는 JDK 9에서 더 이상 사용되지 않는다.
Observer와 Observable이 지원하는 이벤트 모델은 상당히 제한적이며, Observable이 전달하는 알림의 순서는 불특정하며, 상태 변경은 알림과 일대일 대응으로 이루어지지 않는다.더 풍부한 이벤트 모델을 위해서는 패키지를 사용하는 것을 고려하십시오.신뢰할 수 있고 순서 있는 스레드 간 메시징을 위해 패키지의 동시 데이터 구조 중 하나를 사용하십시오.반응형 스트림 스타일 프로그래밍에 대해서는 Flow API를 참조하십시오.
또한 CDi 2.0 , 이벤트 핸들링 사용 가능
문제는 GoF Observer Patternature가 아닌 Java 클래스/인터페이스의 버기 자바 구현에 있다.
'programing' 카테고리의 다른 글
C에서 인쇄()와 스캔()를 위해 매번 데이터 유형을 지정해야 하는 이유는? (0) | 2022.05.02 |
---|---|
VueJs + Element UI: photo el 선택으로 기본값을 설정하는 방법? (0) | 2022.05.02 |
vue 구성 요소에서 링크를 사용하지 않도록 설정하는 방법 (0) | 2022.05.02 |
v-for에 의해 렌더링된 개체 내에서 변경 사항이 발생할 때 DOM을 업데이트하는 방법 (0) | 2022.05.02 |
테스트 적용 범위를 jest를 사용하여 Vue-cli 3의 모든 vue 파일을 표시하는 방법 (0) | 2022.05.02 |