1

メソッド内でフィールド変数への新しい参照を作成する人がいるのはなぜですか?

public class Foo {
    int mFoo[] = {1, 2, 3};

    void method() {
        int foo[] = mFoo; // WHY not just use mFoo?

        print(foo[0]); // WHY not just use mFoo?
    }
}
4

6 に答える 6

5

たとえば、コードの別の場所でmFooの値を変更する場合は良い考えです。特にマルチスレッドのコンテキストでは、適切なデータで作業していることを確認する必要があります。

于 2012-06-27T15:09:12.683 に答える
3

以前は、フィールドをローカル変数にロードしてそれを複数回使用する方が、フィールドに複数回アクセスするよりも高速でした(そして今でもJava ME AFAIKを使用しています)。

ただし、今日、この方法でローカル変数を使用すると、JITコンパイラが混乱する可能性があり、この方法でローカル変数を使用すると、処理速度が低下する可能性があります。

于 2012-06-27T15:10:48.910 に答える
2

それはあなたの目標次第です。パラメータとして渡されたオブジェクトを変更したい場合は、参照されたオブジェクトの型の新しいインスタンスを作成しません。

それ以外の場合は、渡されたオブジェクトへの変更を気にせずに自由に変更できる新しいインスタンスを作成します。これは、マルチスレッド アプリケーションで一般的に使用されます。

于 2012-06-27T15:09:37.840 に答える
2

すでに受け入れられている回答がありますが、このコンテキストでは使用がより理にかなっています。

private Class<?> clazz = ...;

public void foo() {
    Class<?> current = clazz;
    while (current != Object.class) {
        // do some stuff.
        current = current.superclass();
    }
}

この例では、常に「現在」を新しい値に再割り当てしています。変数を使用しない場合の副作用を想像してみてください。

clazz = clazz.superclass();

メソッドに対してローカルではなく、オブジェクト自体のフィールドを変更するため、「foo」を繰り返し呼び出すと、期待する動作が見られません。

于 2012-06-27T19:01:56.853 に答える
1

次のように使用しても意味がありません。

int[] local = somethingElse;
... // changes to local will reflect on somethingElse

実際のコピーが次のように行われるとしたら、それは理にかなっています。

int[] local = Arrays.copyOf(somethingElse,somethingElse.lenght())
... // changes to local will not reflect on somethingElse

コピーにより、他のメソッドを呼び出したり、他のスレッドの干渉によってメソッドに必要な要素が変更されるのを防ぐことができます。たとえば、これらの要素を使用しているときに同時に呼び出されるこの要素を変更するメソッドがある場合。したがって、適用される変更を気にすることなく、コピーを作成して操作することができます。

次のコードを使用してテストを実行できます。

int[] test = new int[] {1,2,3};
int[] test2 = Arrays.copyOf(test,test.length);
test2[0] = 9;
System.out.println(Arrays.toString(test));
于 2012-06-27T15:08:44.293 に答える
0

intのようなプリミティブ型の場合、ポインターではなく値を処理しているため、メソッド「print」を呼び出した後も元の配列は変更されません。ただし、配列には当てはまりません

于 2012-06-27T15:13:36.433 に答える