간단한 구성 대신 약한 참조를 사용하는 것이 더 나은 상황이 있습니까?


10

있지만 자바 문서가 지정이 약한 참조는 기본적으로 매핑 정규화를 들어, 당신이 찾을 수있는 많은 , 많은 , 많은 의 WeakHashMap의 수명 동안 오브젝트 메타 데이터를 저장하기위한 완벽한이라고 진술 인터넷에서 사람들을. 그러나 아무도 이해하기 쉽고 적절한 모범 을 보이려고하지 않습니다 .

WeakHashMap을 사용하여 객체를 추가하거나 메타 데이터 사운드를 저장하십시오. 다시 말해 나쁜 디자인 입니다. 상속을 사용할 수없는 상황 (최종 클래스, 인터페이스)이 있지만 구성은 어떻습니까? 컴포지션이 옵션이 아닌 하나의 예를 생각할 수 없습니다. "언어 적 특징"대신에 잘 확립 된 원칙에 의존하기 때문에 확실히 더 좋은 방법입니다.

그렇다면 간단한 구성 대신 약한 참조를 사용하는 것이 더 나은 상황이 있습니까? 그렇지 않다면 왜 인터넷의 모든 사람이 잘못 생각하는 것입니까?


논리 오류 : "... 지독한 것을 사용하려는 의지에 근거한 임의의 결정. 다시 말하면, 나쁜 디자인입니다." 목적이 수단을 정당화 할 수는 없지만 수단을 사용하여 목적을 논란하기에는 충분하지 않습니다. 동일한 방법이 주어지면 결과는 좋은 디자인이 될 수 있습니다. 이 경우 나는 그것을 주장하지 않을 것입니다. :)
cwharris 2012

3
약한 참조는 구성과 상속에 대한 직교 개념입니다.
Robert Harvey

답변:


13

일부 메타 데이터를 일부 데이터 개체와 연결해야한다고 가정 해 보겠습니다. 이것은 매우 일반적인 시나리오입니다. 나는 데이터 객체를 제어하지 않고 많은 객체가 있으며 문제의 API (콜백, 가상 메소드 등)는 데이터 객체를 제공하지만 메타 데이터는 제공하지 않습니다. 따라서 각 데이터 개체, 즉 이전에 보았거나 다시 볼 수있는 각 상태에 대한 일부 상태를 추적해야합니다. 이 메타 데이터를 장식이라고 부르겠습니다.이 개념은 때때로 해당 개념에 사용되는 용어입니다.

간단한 구성은 메타 데이터 개체 디자인을 제어하기 때문에 데이터 개체에 대한 참조를 직접 넣을 수 있다는 가정하에 장식 개체 (메타 데이터가있는 개체)에서 다른 개체 (데이터가있는 개체)로 쉽게 조회 할 수 있도록합니다. .

그러나 데이터 객체의 디자인을 제어하고 변경할 수 없다면 간단한 구성은 데이터 객체에서 일부 메타 데이터로 역방향 조회를 제공하지 않습니다. 실제로 메타 데이터 개체 모음이 없으면 개체 (데이터) 항목이 지정된 관련 메타 데이터 항목을 찾을 수도 없습니다.

객체에서 장식 메타 데이터를 찾기 위해 방향을 찾는 문제 외에도 메타 데이터 수명 문제도 있습니다.

데이터 개체를 더 이상 사용하지 않아도 누적되고 해제되지 않는 메타 데이터는 메모리 누수입니다.

약한 참조 해시 맵은 두 가지 문제를 모두 해결합니다. 데이터가 제공된 메타 데이터를 찾을 수 있으며 데이터가 해제 된 후 언젠가 메타 데이터를 해제 할 수 있습니다.

약한 참조 해시 맵을 사용하면 (메타 데이터) 값을 교정 (gc'ed) 할 수있을뿐만 아니라 (데이터) 키를 교정 (gc'ed) 할 수 있습니다. 메모리 누수, 그리고 더 이상 값을 해제 할 수 없었습니다.


약한 해시 맵 기반 메타 데이터 테이블이있는 데이터 개체를 구성으로 사용하지 않는 이유는 무엇입니까?
Jack

2
@Jack, 컴포지션, 특히 제 생각에는 "간단한 컴포지션"은 다른 객체를 참조하는 객체이지만 직접적으로도 마찬가지입니다. 컴포지션의 "has-a"관계는 간단한 참조 또는 때로는 컬렉션을 사용하여 표현됩니다. 여기서 해시 맵은 간접적 인 방법입니다. 해시 맵이 없으면 장식품에 연결할 수 없습니다. 구성에서이 탐색을 수행 할 수 있습니다. 따라서이 메타 데이터를 컴포지션이 아닌 장식품이라고 부르고 싶지만 확실히 관련이 있습니다. 그러나 장식품 (IMHO)은 다른 방식이 아니라 데이터로 구성됩니다.
Erik Eidt

@Jack, re : 마지막 FWIW, 약한 해시 맵을 사용할 때 일반적으로 메모리 보유로 인해 메타 데이터 장식 객체에서 다른 객체로 참조를 넣지 않는다는 것을 깨달았습니다 (또는 방향은 약한 참조 여야합니다). 따라서 일반적으로 약한 해시 맵 클라이언트는 서로 효과적으로 짝을 이루지 만 기술적으로 서로 객체 구성에 있지 않은 두 개의 객체로 작동합니다.
Erik Eidt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.