0

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();
    }
}
4

5 回答 5

3

B只要属性仍然存在,您是否通过它的属性或 getter 访问真的没关系private(所以是的,调用getB()是一种矫枉过正,它当然不会破坏任何设计模式)。

于 2013-10-18T18:46:41.777 回答
3

在这种情况下,它可能是矫枉过正,因为它是一个简单的对象。但是如果有延迟加载并且你的对象看起来像这样..

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-18T18:49:36.783 回答
2

您通过使用吸气剂将风险降至最低。如果事实证明这B是在一个用例中,或者由于新需求而null需要初始化怎么办。B此模式允许您更新getB()而无需更改A.

public B getB(){
   if(b == null) {
       b = getEntityManger().findB(); // or wherever you wanted to get B from
   }

   return b;
}
于 2013-10-18T18:55:53.700 回答
1

仅当您制作了整个班级,或者至少制作了 setter 和 getter 时,才可以final

否则这会中断:

class A2 extends A {

    private B2 b;

    @override
    public void setB(B b){
         this.b = new B2(b);
    }

    @override
    public B getB(){
         return b.toB();
    }
}

现在调用非覆盖doJob()将使用错误的成员变量。

于 2013-10-18T18:49:25.947 回答
1

为私有成员提供访问器/修改器方法使您能够添加错误检查、更改成员的存储以及在类内部执行其他操作。您如何访问班级中的成员是您的选择。

如果您发现稍后需要更改类内部,则可以切换到访问器/修改器。当然,这个简单的示例不需要访问器(getter)方法。但是要意识到使用 getter 可能会受益于更复杂的情况。

于 2013-10-18T18:54:27.560 回答