2010-07-29 9 views
9

좋은 자바 객체 그래프 방문자 라이브러리를 알고 계십니까?자바 객체 그래프 방문자 라이브러리

일부 조건이 충족되면 개체와 그 하위 구성 요소를 방문하여 일부 작업을 수행하려고합니다.

사용 예 : 거 도메인 객체 그래프

  • TreeSet 인스턴스가 동일한 함유 각 Set 교체 큰 도메인 객체 그래프 에게 null
  • 각 ID를 재설정 집단.

개체 그래프를 탐색하는 것이 까다로울 수 있으므로 사용자 지정 코드가 아닌 라이브러리가 필요합니다. 컬렉션, 배열, 프록시 등을 처리해야합니다 ... 이 작업을 수행하기 위해 XStream의 재사용 부분에 대해 생각해 보았지만 쉽게 보지 못합니다. Xstream 방문자는 개체 자체 수정보다 개체 변형에 더 중점을 둡니다. .

+0

+1, 재미있는 질문! –

답변

1

왜 그렇게하기 위해 라이브러리가 필요합니까?

도메인 개체 그래프를 지정하면 다른 방문자 구현에서 도메인 개체를 방문 할 수 있도록 관련 인터페이스를 정의하고 구현해야하는 이유는 무엇입니까? 구현 중 하나는 (사용자가 지정한대로) 각 ID를 null으로 재설정 할 수 있습니다.

첫째로 방문자 방문하거나 행동 할 수있는 오브젝트에 의해 구현 될 수있는 인터페이스를 정의한다.

public interface Visitable { 
    void visit(Visitor visitor); 
} 

public interface Visitor { 
    void visitDomainObjectA(DomainObjectA obj); 
    void visitDomainObjectB(DomainObjectB obj); 
} 

이제 두 개의 도메인 개체 클래스를 모두 정의 할 수 있습니다. 둘 다 방문 할 수 있습니다.

public abstract class DomainObject implements Visitable { 
    private Object id; 

    public Object getId() { return this.id; } 
    public void setId(Object id) { this.id = id; } 
} 

public class DomainObjectA extends DomainObject { 
    public void visit(Visitor visitor) { 
    visitor.visitDomainObjectA(this); 
    } 
} 

public class DomainObjectB extends DomainObject { 
    public void visit(Visitor visitor) { 
    visitor.visitDomainObjectB(this); 
    } 
} 

지금 유용한 무언가를 구체적인 방문자 구현을 정의

public class MyVisitor implements Visitor { 
    public void visitDomainObjectA(DomainObjectA doa) { 
    doa.setId(null); 
    } 

    public void visitDomainObjectB(DomainObjectB dob) { 
    doa.setId(UUID.randomUUID()); 
    } 
} 
+0

관련 답변에 대한 제 질문을 수정했습니다. 내 도메인이 크고 그래프가 복잡합니다. 그래서 나는 강력하고 이미 디버깅을하고 사용할 준비가 된 것이 필요합니다. – Guillaume

+0

IMO 당신은 uber-generic이 되려고 노력하면서 문제를 까다롭게했습니다. 어떤 * 객체 그래프 (아마도 리플렉션에 의해)를 횡단 할 수있는 라이브러리의 포인트는 무엇입니까? 그리고 주어진 객체의 모든 메소드 *를 호출합니까? 컴파일 타임 타입 안전을 효과적으로 버립니다. 결국 모든 OO 응용 프로그램은 단순히 객체 그래프를 탐색하고 객체의 하위 집합에서 메서드를 호출하는 것이라고 주장 할 수 있습니다. – Adamski

+0

나는 uber-generic이되고 싶지 않다. 내 도메인은 위버 복잡합니다;) 그런데, 그것은 XStream과 같은 직렬화 도구가 작동하는 방식입니다. 그리고 그들은 잘 작동합니다. – Guillaume

1

어떻게 XML로 개체 그래프를 정렬 화 및 일부 표준 XML 처리/조작 라이브러리를 사용하는 방법에 대해?

+0

그건 좋은 제안이지만 가능하면 피하고 싶습니다. 그것은 내가 피할 수있는 더 많은 단계를 추가합니다. – Guillaume

+0

그 단계는 무엇입니까? – Jatin

+0

'개체 자체 수정'부분은 아마도 커스텀 코드가 많이 필요할 것입니다 ... – Guillaume

1

Neo4j 또는 TitanDB과 같은 그래프 데이터베이스를 사용해 보는 것이 좋습니다. 데이터 세트를 교차 분석하고 관계를 탐색하는 쿼리를 사용하여 방문에 영향을 줄 수 있습니다.

두 가지 모두 광범위한 Java API를 사용하여 데이터로드 및 쿼리를 용이하게합니다.

2

나는 그런 일을했습니다. 실제로 도서관이 아니라 쉽게 성장할 수 있습니다.

하지만 나는 더 나은 것을 찾고 있기 때문에 비틀 거리며 넘어졌습니다. 나는 그것을 포기할 수 없다. 그리고 그것은 분명히 내가 이것을 할 수있는 상태에 있지는 않지만, 아마도 그러한 것이 OS로서 생겨나야만 할까?

내가 갖고있는 것은 객체 그래프를 유형별로 안전하게 인스턴스별로 트래버스하고 수정할 수있게 해준다. 옵션으로 원본을 변경하지 않고 복제 할 수도있다. Java BTW.그래프에서 관계를 파악하는 것도 약간 효과가 있습니다 (원하는 경우 가장자리).

내가 생각할 수있는 것은 조작 (예 : 수정, 확장, 복제, 축소, 트래버스) 및 각각의 구현에 대한 명확한 정의입니다. 하위 그래프를 식별하는 것과 같은 직교적인 측면이 적절히 고려 될 수 있습니다.

그러한 프로젝트에 관심이있는 사람이라면 누구나 응답 해주십시오.