考虑以下示例:
问题:撰写这3个班级的正确方法是什么?
选项-1:
class B {
public B(A a) {
c = new C(a)
}
public Foo calcXX() {
// do something useful using C
a.doSideEffect(..)
return foo;
}
}
class C {
public C(A a) { ... }
public Bar calcBar() {
a.doSideEffect(...)
return bar;
}
}
选项-1的缺点:
选项-2:
class B {
public B() {
a = A.getInstance()
}
public Foo calcXX() {
// do something useful using C
a.doSideEffect(..)
return foo;
}
}
class C {
public C() { a = A.getInstance() }
public Bar calcBar() {
a.doSideEffect(...)
return bar;
}
}
答案 0 :(得分:3)
此处建议的选项都不是特别好。
B
的构造函数,它会创建一个新的C
。如果B
需要C
的实例,则应在其构造函数中声明该实例。更好的选择是:
class B {
public B(A a, C c) { }
public Foo calcXX() {
// do something useful using C
a.doSideEffect(..)
return foo;
}
}
class C {
public C(A a) { ... }
public Bar calcBar() {
a.doSideEffect(...)
return bar;
}
}
C
也使用A
的事实与B
无关。
您现在可以像这样撰写B
和C
的实例:
a = new A()
c = new C(a)
b = new B(a, c)
请注意,A
和b
同时使用c
的同一个实例。
有关高效图表合成的更多信息,请参阅http://blog.ploeh.dk/2011/03/04/Composeobjectgraphswithconfidence