4

次の変数の使用法の違いは何ですか

public class A{

    B b= new B();

    public void doSomething()
    {
        b.callme();
    }
}

VS

public class A { 
    B b;
    public void doSomething() {
        b=new B(); 
        b.callme();
    }
}

クラス内に単一の「b」がある場合、どちらがより良いプラクティスであり、その理由. そして、どのような状況で使用する必要があるか。

4

6 に答える 6

5

これらは実際には非常に異なる意味を持っています。ケース 1 では、bオブジェクトはのA構築時に割り当てられます。これは一度だけ構築されます (クラス外のどこかから再割り当てしない限り)。

ケース 2 では、メソッドが呼び出されるたびにA'sインスタンスを再割り当てしていますb

于 2013-03-05T13:18:44.133 に答える
0

Class level instantiationクラスの新しいオブジェクトが作成されると、クラス変数がインスタンス化されます。method instantiationメソッドが呼び出されると、Whileは変数をインスタンス化します。

グッドプラクティス:クラス変数が/である必要がある場合は、そうする必要があります。そうでない場合は、ieClass level instantiationを使用しますinstantiate in Constructorfinalmethod instantiationlazy initialization

于 2013-03-05T13:17:05.593 に答える
0

Case 2:遅延初期化に役立ちます

In case 1のオブジェクトをB作成すると、 のオブジェクトが作成されますA。ただし、作成B重い操作の場合は、実際に B インスタンスが必要なときに遅延して作成できます。

Lazy Initializationオブジェクトの作成が重いタスクであり、実際に使用されているときにのみオブジェクト インスタンスを遅延作成したい場合に役立ちます。ただしthread safety、クラスがスレッド間で共有されている場合は注意してください。

UPDATE :しかし、あなたのケースでは、メソッドが呼び出されるたびに参照 b を再割り当てしています。それ自体は遅延初期化ではありません。

//example of lazy initialization
public B getB()
{
  if (something =  = null)
    b = new B();
  return b;
}
于 2013-03-05T13:17:11.433 に答える
0

最初のケースはインライン初期化と呼ばれます。これは、コンストラクターの本体が実行される前に発生しますが、スーパー コンストラクターの呼び出し後に発生します。

2 番目のケースでは、doSomething が呼び出されるまで b は初期化されません。

どちらが優れているかは、プログラムのロジックによって異なります。doSomething が呼び出されるたびに新しいインスタンスが必要な場合は、2 番目の方法が適しています。b を遅延ロードしたい場合は、次のように変更します。

if (b == null) b = new B(); 
return b;

個人的には、読みやすさのために、コンストラクターにインスタンス変数を割り当てるのが一般的です。

public class A {
  B b;

  public A() {
    b = new B();
  } 
}
于 2013-03-05T13:17:13.837 に答える
0

ここでの本当の違いは、呼び出されるBたびに異なるインスタンスが必要かということです。doSomething2 番目のケースではこれは当てはまりますが、 を使用する他のメソッドがある場合、クラスがスレッドセーフではないことも意味しますB。また、使用しているクラスに他のメソッドがない場合、Bそれをメソッドスコープの変数にしないのはなぜですか?

于 2013-03-05T13:19:28.513 に答える