在doJob()方法中,B通过getter引用。我个人不赞成这个想法,我更喜欢b.execute(),因为我确信getB()永远不会被修改。
我知道,通过这样做,将远离封装,但是封装B对象不是在这里造成了过度吗?
class A{
private B b;
public void setB(B b){
this.b = b;
}
public B getB(){
return b;
}
public void doJob(){
getB().execute();
}
}发布于 2013-10-18 18:46:41
如果通过属性或getter访问B并不重要,只要属性仍然是private (因此,调用getB()是过头的,它当然不会破坏任何设计模式)。
发布于 2013-10-18 18:49:36
在这个场景中,它可能是过分的,因为它是一个简单的对象。但是如果有延迟加载,而您的对象看起来是这样的..
class A{
private B b;
public void setB(B b){
this.b = b;
}
public B getB(){
this.b = this.b ?? new B();
return this.b;
}
public void doJob(){
getB().execute();
}
}那么,通过物业访问您的私人成员并不是过分的做法。
我不知道这是否对您有所帮助,但是如果B是一个依赖项,那么您的对象应该像这样设置,其中IB是具体对象B的接口。这是控制模式的反转,将具体对象B与A分离开来,但对于简单的对象图来说,这也是过分的。
class A{
private IB b;
// Use inversion of control
public A(IB b){
this.b = b;
}
public IB getB(){
return this.b;
}
public void doJob(){
getB().execute();
}
}发布于 2013-10-18 18:55:53
通过使用getter,您正在最小化风险。如果发现B在一个用例中是null,或者由于新的需求需要初始化B,该怎么办?此模式允许您更新getB(),而不必更改A中的任何其他内容。
public B getB(){
if(b == null) {
b = getEntityManger().findB(); // or wherever you wanted to get B from
}
return b;
}https://stackoverflow.com/questions/19456911
复制相似问题