我有一个组:父对象和子对象。对象可以在实例化后彼此附着。我想在这些对象之间有一个循环引用,但是通过而不是具有依赖性来维持可重用性。
例如:父亲是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 :(得分: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
类型的字段 - 并Firewall
和Route
扩展MyObject
。
或者,您似乎希望能够附加到任何可序列化对象,而不仅仅是某些扩展自定义类的。
不是父母是MyObject
,而是:
class Firewall //extends whatever
{
Serializable parent;
}
class Router // extends whatever
{
Serializable parent;
}
我不确定您希望能够通过附加的Objects
完成什么 - 我认为您唯一能做的就是序列化和反序列化它们 - 如果您想要与它们进行进一步的交互,有些观点,你必须开始期待某些类或方法注释。
在提及您的新问题时 - 您需要implement
您的界面并提供您在课程中定义的两种方法。