循环引用示例

时间:2016-01-19 19:37:08

标签: java

我有一个组:父对象和子对象。对象可以在实例化后彼此附着。我想在这些对象之间有一个循环引用,但是通过而不是具有依赖性来维持可重用性。

例如:父亲是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);

}

2 个答案:

答案 0 :(得分: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;库。它将处理传递给它的空值。

答案 1 :(得分:1)

创建默认的可序列化对象 - 此MyObject会替换您计划使用Object的任何位置。

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

parent成为MyObject类型的字段 - 并FirewallRoute扩展MyObject

或者,您似乎希望能够附加到任何可序列化对象,而不仅仅是某些扩展自定义类的。

不是父母是MyObject,而是:

class Firewall //extends whatever
{
    Serializable parent;
}

class Router // extends whatever
{
    Serializable parent;
}

我不确定您希望能够通过附加的Objects完成什么 - 我认为您唯一能做的就是序列化和反序列化它们 - 如果您想要与它们进行进一步的交互,有些观点,你必须开始期待某些类或方法注释。

在提及您的新问题时 - 您需要implement您的界面并提供您在课程中定义的两种方法。