를 사용해야 하 복제 새로 추가할 때를 받으려면 어떻게 해야 합니까?해야 할 때 복제 사용될까요?

StackOverflow https://stackoverflow.com/questions/63748

  •  09-06-2019
  •  | 
  •  

문제

을 구현하려는 자바에서 클래스를 위한 처리를 그래프로 데이터 구조입니다.내가 노래하고자 클래스입니다.그래프 클래스를 유지 두 가지 목록:목록 노고 목록을의 가장자리입니다.각 노드가 있어야합한 이름입니다.나는 어떻게 경비에 대해 이 같은 상황:

Graph g = new Graph();

Node n1 = new Node("#1");
Node n2 = new Node("#2");

Edge e1 = new Edge("e#1", "#1", "#2");

// Each node is added like a reference
g.addNode(n1);
g.addNode(n2);
g.addEdge(e1);

// This will break the internal integrity of the graph
n1.setName("#3");   
g.getNode("#2").setName("#4"); 

내가 믿고 한 복제 노드 및 가장자리를 추가할 때 그들을 그래프에 반환 NodeEnvelope 클래스를 유지하는 그래프는 구조적 무결성이 있습니다.이것은 올바른 방법으로 이것을 하나 디자인이 깨지 처음부터 다시 시작하시겠습니까?

도움이 되었습니까?

해결책

나는 그래프는 구조 자바에서 많이,그리고 제 조언을 할 수 있는 모든 데이터 구성원의 노드를 가리 클래스는 그래프에 의존 유지를 위한 그것의 구조를 최종 없 setter.사실,당신이 할 수있는 경우에,저는 노드 및 가장자리를 완전히 변하지 않는 많은 혜택.

예를 들면 다음과 같습니다.

public final class Node {

    private final String name;

    public Node(String name) {
           this.name = name;
    }

    public String getName() { return name; }
    // note: no setter for name
}

당신이 다음의 유일성 확인을 그래프에서 개체:

public class Graph {
    Set<Node> nodes = new HashSet<Node>();
    public void addNode(Node n) {
        // note: this assumes you've properly overridden 
        // equals and hashCode in Node to make Nodes with the 
        // same name .equal() and hash to the same value.
        if(nodes.contains(n)) {
            throw new IllegalArgumentException("Already in graph: " + node);
        }
        nodes.add(n);
    }
}

을 수정해야 할 경우 이름의 노드를 제거,이전 노드를 추가하는 새로운 하나입니다.이 들리는 것과 같은 추가 작업,그러나 그것은 노력을 많이 저장을 유지하는 모든 직선입니다.

정말이지만,자신의 작성을 그래프는 구조를 지상에서 아마 불필요--이 문제는 단지 많은 사람들의 첫번째 가능성이 있으로 실행하는 경우입니다.

나는 추천을 찾는 것은 오픈 소스 소 Java 그래프 라이브러리,그리고 사용하는 대신 합니다.에 따라 당신은 무엇을 하는지,거기에 몇 가지 옵션이 있습니다.용 과거에는,그것으로 좋은 출발점입니다.

다른 팁

그것은 명확하지 않을 왜 나를 추가하는 추가적인 간접의 문자열 이름에 대한 노드입니다.지 않을 더 많이 만들에 대한 감각을의 가장자리가 생성자의 서명은 같은 것을 public Edge(String, Node, Node)public Edge (String, String, String)?

나는 어디에 있는지 모르겠 복제 당신을 도울 것입니다 여기에.

ETA:는 경우 위험하면서 얻은 노드 이름을 변경한 후에는 노드가 만들어 던져 IllegalOperationException 는 경우 클라이언트가 통화는 즉시 기능이 완료된 후에 파괴()노드에서 기존의 이름입니다.

제 생각에는 결코 복제 요소가 명시적으로 동의하지 않는 한 국가는 데이터의 구조는 않습니다.

원하는 기능의 대부분의 것들 필요가 실제 물체의 전달로 데이터 구조에 의한 참조가 있습니다.

는 경우에 당신을 만들고 싶 Node 클래스는 안전,그것은 내부의 클래스는 그래프.

사용 NodeEnvelopes 또는 가장자리/노드를 공장이 소리 같은 overdesign 다.

당신이 정말로 원하는 노출하는 즉시 기능이 완료된 후에 파괴()메소드에서 노드에까?아무것도에 모범 제안하는 당신은 필요합니다.만약 당신 모두의 노드를 가리 클래스에는 불변의 대부분 무결성 위반 시나리오를 당신이 계획되 불가능합니다.(필요할 경우를 변경할 수 있지만할 때까지는 그래프에 추가,당신을 적용할 수 있는 이해를 갖는 isInGraph 깃발에 귀하의 노드/Edge 는 클래스를 설정을 사실에 의해 그래프입니다.추가{Node,가장자리},그리고 당신의 뮤 테이터 예외를 호출한 경우 이 플래그가 설정됩니다.)

동의함으로 jhkiley 하고 전달하는 노드가 객체를 가장자리에 생성자(대신 문)같은 소리는 좋은 생각이 아니다.

하려면 더 많은 관입 접근할 수 있습니다 포인터 에서 노드 등을 그래프에 있고,업데이트 그래프는 경우 어떤 중요한 속성(예를 들어,이름)의 노드 이제까지 변경합니다.그러나 나는 그렇게 하지 않겠지 않는 한 당신은 확실히 당신이 할 수 있어야의 이름을 변경한 기존 노드를 보존하고 있는 동안 가장자리의 관계를 보인다,가능성이 크다.

체입니다.론()는 몇 가지 중요한 문제이며,그 사용은 권장하지 않습니다.항목을 참조하십시오 11"효과적인 자바"여호수아의 블로흐에 대한 완전한 대답합니다.내가 믿고 안전하게 사용할 수 있는 객체입니다.론()에는 기본 형식 어레이,하지만 떨어져야 하는 것을 현명에 대해 제대로 사용하고 재정의 클론입니다.당신은 아마 더 나을 정의하는 복사본을 생성자 또는 정적 공장하는 방법을 명시적으로 복제하고 목적에 따라 귀하의 의미입니다.

한 의견@jhkiley.blogspot.com 을 만들 수 있습니다,공장을 위한 가장자리와 노드를 거부하는 개체를 만드는 이름으로 이미 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top