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

このシナリオでは、単純なオブジェクトであるため、おそらくやり過ぎです。しかし、遅延読み込みがあり、オブジェクトがこのように見えたらどうなるでしょうか..

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が1 つのユース ケースであることが判明した場合、または新しい要件のため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

クラス全体を作成するか、少なくともセッターとゲッターを作成する場合にのみ、それで問題ありません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) メソッドは必要ありません。しかし、より複雑なケースでは、ゲッターを使用することでメリットが得られる可能性があることに注意してください。

于 2013-10-18T18:54:27.560 に答える