Как правильно создать две сущности с циклической зависимостью? - PullRequest
3 голосов
/ 12 ноября 2010

Если у меня есть две сущности, Parent и Child, Parent необходимо знать обо всех своих Child дочерних элементах, а каждый экземпляр Child должен знать о своем родительском экземпляре Parent, как я делаю это правильно (с точки зрения DDD и т. д.)?

Самый простой способ - сделать parent.addChild(new Child(parent)), но это выглядит некрасиво - также как:

parent.addChild(new Child()); // Then call some setParent method on child, which needs to be public

Мне нужно использовать фабрику здесь? И если да, то как?

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 ноября 2010

Вы не ограничены одним подходом. Вы должны использовать подход, который подходит вам.

В SWT дочерний элемент связан с родителем в конструкторе:

new Label(parentComposite, SWT.NONE);

После этого parentComposite знает своего потомка.

Примечание: SWT требует создания родительского элемента при создании, что ограничивает некоторые функциональные возможности - вы не можете создать дочерний элемент без указания дочернего элемента. Это ограничение SWT.

В Swing вы можете создать дочерний виджет, а затем добавить его к родителю.

Те, что выше, только примеры. Ваше личное решение будет основано на ваших потребностях.

Я бы посоветовал использовать меньше методов, больше последовательности (не оставляйте своих детей без связи с родителями)

Говоря о коде, я бы использовал следующий метод:

Parent {
 addChild(Child child) {
  children.add(child);
  child.setParent(this);
 }
}

Надеюсь, это поможет. Удачного проектирования!

2 голосов
/ 12 ноября 2010

Как насчет того, чтобы сделать что-то вроде этого:

public class Child {
   Child (Parent parent) {
      ... 
      this.parent = parent;
      parent.addChild(this);
   }
}

Таким образом, вы можете установить родителя на Child только при создании child.

2 голосов
/ 12 ноября 2010

Один из вариантов - иметь соответствующий метод экземпляра в классе Parent. Статическая фабрика, вероятно, здесь не нужна, поскольку вы работаете с существующими объектами и просто должны соединить объект с другим.

public class Parent {

    // ...

    public Child createChild() {
        Child c = new Child(this);
        this.addChild(c);
        return c;
    }

    protected void addChild(c) {
        // ...
    }

    // ...

}

public class Child {

    public Child(Parent p) {
        // ...
        this.addParent(p);
    }

    protected addParent(Parent p) {
        // ...
    }
}

Если конструктору Child нужны аргументы, вы можете передать их в метод createChild.

...