2016-01-19 4 views
-4

У меня есть группа: родительский объект и дочерний объект. Объекты могут быть прикреплены друг к другу после инстанцирования. Я хотел бы иметь круговую ссылку между этими объектами, но поддерживать повторное использование на не, имеющей зависимость.Циркулярные ссылки Пример

Например: родитель Firewall, а ребенок Route. Я хотел бы прикрепить Route к Firewall и наоборот. На Route я позвоню this.getParent() и предоставит Firewall.

Как это сделать?

ОК, так что я добавить немного кода в качестве примера:

public class Firewall_Record extends DefaultDevice implements Comparable, Serializable { 
private Object parent; 

public void addRoute(Route r){ 
r.setParent(this); 
} 

public void setparent(Object o){...} 

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (obj == this) { 
     return true; 
    } 
    if (!(obj instanceof Firewall_Record)) { 
     return false; 
    } 

    Firewall_Record rhs = (Firewall_Record) obj; 
    return new EqualsBuilder(). 
      append(this.parent, rhs.parent). 
      isEquals(); 
} 

} 


public class Route_Record implements Comparable, Serializable { 
private Object parent; 

public void setparent(Object o){...} 

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (obj == this) { 
     return true; 
    } 
    if (!(obj instanceof Firewall_Record)) { 
     return false; 
    } 

    Firewall_Record rhs = (Firewall_Record) obj; 
    return new EqualsBuilder(). 
      append(this.parent, rhs.parent). 
      isEquals(); 
} 

} 

Я не хочу, чтобы вернуться назад и изменить все классы для расширения в какой-то базовый класс, который реализует Serializable, если я могу избежать Это.

Я создал этот интерфейс, который бы разрешил мою проблему установки общего родительского объекта, а не создания зависимостей. Я изо всех сил пытаюсь найти способ применить его.

public interface ParentInterface<T> { 

    T getParent(); 

    void setParent(T t); 

} 
+0

Почему вы считаете, что вам нужна круговая зависимость? (Кстати, это не так сложно сделать, что вы сделали, чтобы заставить это работать, и где вы споткнулись?) – Makoto

+0

У модели есть круговая задача, а затем просто пусть она круглая. – AlexWien

+0

Если брандмауэр должен ссылаться на маршрут, он должен зависеть от маршрута. Если Route должен ссылаться на брандмауэр, то он должен зависеть от брандмауэра. Вы можете изменить муфту, но никогда не удаляйте ее. – DwB

ответ

2

У вас есть некоторая путаница в отношении того, что составляет «зависимость». Для того, чтобы сделать то, что вы хотите, это очень просто:

class Parent { 
    Child child; 
    public void setChild(Child c) { this.child = c; } 
    public Child getChild() { return this.child; } 
} 

class Child { 
    Parent parent; 
    public void setParent(Parent p) { this.parent = p; } 
    public Parent getParent() { return this.parent; } 
} 

В каждом случае объект может содержать ссылку на другой объект. Это не создает зависимость . Зависимость выглядела бы так:

class A extends B { 
    ... 
} 

class B extends A { 
    ... 
} 

В этом случае каждый класс определяется другим классом. Ни один из них не может быть построен первым, потому что он требует знания другого и, следовательно, является циклической зависимостью. Это явно запрещено в Java.

Теперь, в отношении вашего корпуса equals(), довольно неясно, что вы пытаетесь. Свидетель:

public boolean equals(Object obj) { 
    //These clauses make sense 
    if (obj == null) { return false; } 
    if (obj == this) { return true; } 
    if (!(obj instanceof Firewall_Record)) { return false; } 

    Firewall_Record rhs = (Firewall_Record) obj; 

    //This will handle null values. 
    return Objects.equals(this.parent, rhs.parent) 
} 

Это происходит из библиотеки import java.util.Objects;. Он будет обрабатывать нулевые значения, переданные ему.

+0

Проблема у меня в том, что в родительском элементе появляется «Родитель». Если класс не имеет родителя, есть нулевой указатель. Если я делаю «Родительский родитель = новый родительский()« У меня есть стек над потоком, поскольку оба класса указывают друг на друга. –

+0

Вам следует опубликовать код, в котором вы пытаетесь это сделать, потому что неясно, как вы делаете это так, как вы вызываете эту проблему. –

1

создать стандартный сериализуемый объект - этот MyObject заменит там, где вы планируете использовать Object.

class MyObject implements Serializable 
{ 
    //... default code 
} 

имеют parent быть полем типа MyObject - и есть Firewall и Route продлить MyObject.


В качестве альтернативы, вы, кажется, хотят, чтобы иметь возможность прикрепить к любой Serializable объект, а не только некоторые из них, которые бы расширить пользовательский класс.

Вместо того, чтобы родитель быть MyObject, есть это:

class Firewall //extends whatever 
{ 
    Serializable parent; 
} 

class Router // extends whatever 
{ 
    Serializable parent; 
} 

Я не уверен, что вы ожидаете, чтобы быть в состоянии выполнить прилагаемым Objects - Я думаю, единственное, что вы можете сделать, это сериализации и десериализации их - если вы хотите продолжить взаимодействие с ними, в какой-то момент вам придется начинать ожидать определенных классов или аннотаций метода.


В ссылке на ваш новый вопрос - вы должны implement свой интерфейс и предоставить два метода, которые вы определили в класс.

+0

Мысль об этом, но тогда у вас осталась та же проблема. «parent» по-прежнему определяется как «Object parent»; в «MyObject», который не является сериализуемым. –

+0

'MyObject' * - * родительский элемент - почему он должен содержать' Object'? – DoubleDouble

+0

Если «MyObject» содержит поле с именем parent, какой класс будет родителем? –

Смежные вопросы