2009-11-28 4 views
3

클래스에 양방향으로 작동해야하는 클래스 (1 : 1, 1 : n, n : n)가있는 Java 모델이 있습니다.내 Java 모델의 양방향 연결 관리

예 : 클래스 A는 부모 (A) 인 B의

모든 인스턴스가 알고 있어야 클래스 B의 컬렉션이 있습니다. B의 부모 속성을 변경하면 다른 측면에서도 연관성을 업데이트해야합니다.

필자는 양쪽 끝에 연관 관계를 유지하는 코드를 작성하는 것이 매우 지루하고 오류가 있다고 생각합니다.

So : 이렇게하는 더 좋은 방법이 있습니까? 두 개체 사이의 양방향 연결을 관리 할 수있는 Java 라이브러리가 있습니까?

+1

"코드를 작성하면 양쪽에서 연결을 최신 상태로 유지할 수 있습니다. 매우 지루하고 오류가 있습니다." 왜 그런 말을 해? 이것은 일반적으로 전혀 어렵지 않습니다. –

+0

내 모든 모델 클래스에 동일한 기능을 추가해야하기 때문에 지루합니다. 나는 이것이 꽤 반복적 인 일이라고 생각한다. Errorprone. 특별한 경우를 염두에 두어야하기 때문에. 예 : B의 부모를 A의 다른 인스턴스로 설정하면 (A를 다른 A로 B를 전송하는 경우) 어떻게됩니까? 이전 링크가 제거되었는지 확인해야합니다. 그러나 같은 부모를 두 번째로 설정하면 어떨까요? 그런 다음 코드는 이미 존재하는 링크를 건드려서는 안됩니다. 기타 물론이 문제를 해결하는 것이 불가능하지는 않지만, 이미이 문제에 대한 해결책이있는 경우 왜 바퀴를 다시 만들어야합니까? – Damian

답변

1

당신은 세 가지 옵션이 있습니다

  1. 이 협회의 양쪽 끝을 관리를;
  2. 효과적으로 양방향으로 만듭니다. 이 말은 단방향이지만 코드를 통해 다른 방향으로가는 것을 의미합니다. 또는
  3. 가로 세로 프로그래밍.

예를 들어, 집과 방 사이에 일대 다 관계가 있습니다. 방에는 하우스에 대한 참조가 있습니다. 주택 목록을 유지하거나 다음과 같이 할 수 있습니다.

public class House { 
    ... 

    public List<Room> getRooms() { 
    List<Room> ret = new ArrayList<Room>(); 
    for (Room room : /* list of ALL rooms */) { 
     if (room.getHouse().equals(this)) { 
     ret.add(room); 
     } 
    } 
    return ret; 
    } 
} 

이렇게하면 성능이 저하 될 수 있습니다.

(3) Aspect Oriented Programming (예 : Spring AOP, AspectJ)을 사용하여 House on Room 설정시 포인트 컷을 생성하여 하우스를 자동으로 업데이트 할 수 있습니다. 개인적으로 나는이 접근법을 외면하는 경향이 있는데, 너무 혼란스럽고 악몽이 될 수있는 너무 많은 "마법"이있는 상황에 쉽게 빠질 수 있기 때문입니다.

5

또 다른 접근법은 문제의 대상에서 관계를 이동시키는 것입니다. 여러 번 A도 B도 서로에 대해 알 필요가 없습니다. 편리한 코드를 사용하는 코드입니다. 그래프 또는 양방향지도가 작동 할 수있는 곳입니다.

일대일 관계를 추적하기 위해 양방향 맵을 사용하는 것이 일반적입니다. 그래프는 다른 유형의 카디널리티 (대다수, 다 대다, 등)를 추적하는 데 훨씬 뛰어날 수 있습니다.

그 목적을 달성 할 수있는 몇 가지 다른 그래프 구현이 있습니다. 나는 들어 본 적이 있지만 JGraphT를 사용하지는 않았으며, Plexus (IOC 컨테이너와 관련이 없음)라는 많은 것을 사용했습니다. http://jgrapht.sourceforge.net/http://plexus.sf.net/입니다.

그래프는 서로 다른 관계가 정의되고 양방향 링크가 암시 적으로 유지되는 방식을 완벽하게 융통성있게 해주기 때문에 좋습니다.

관계의 양측이 동기화 상태를 유지해야한다는 사실은 종종 관계 자체가 종단점과 동등한 중요성을 가지며 각 쪽이 캡슐화하려고 시도해야하는 것이 아니라는 신호입니다.

부모와 자식이 실제로 일 때이 서로 작동해야하는 경우 한 가지 방법은 어느 것이 기본인지와 모든 작업을 해당 개체를 통해 수행 할 수 있는지 여부입니다. 예를 들어 부모 자식 관계에서 자식 작업은 부모 작업이 수행되는 동안 부모 작업이 자식 작업에 대한 참조를 전달할 수 있습니다. 나는 당신이 할 수 없다면 어떤 선들이 디자인에 다시 그릴 필요가 있다는 것을 좋은 지표라고 주장 할 것이다.

다시 부모 - 자식 예제를 사용하여 부모 -> 자식 관계와 자식 -> 부모 관계가 너무 동적이어서 한쪽 끝이 제어 할 수없는 경우를 찾지 못했습니다. 그리고 시간의 99 %는 내가 보조에서 기본으로 백 레퍼런스를 유지하는 것이고, 이는 편의를위한 것이며 관계의 수명주기가 잘 정립되어 있습니다.

... 그렇지 않으면 그래프를 사용합니다.