メソッド内でフィールド変数への新しい参照を作成する人がいるのはなぜですか?
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?
}
}
メソッド内でフィールド変数への新しい参照を作成する人がいるのはなぜですか?
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?
}
}
たとえば、コードの別の場所でmFooの値を変更する場合は良い考えです。特にマルチスレッドのコンテキストでは、適切なデータで作業していることを確認する必要があります。
以前は、フィールドをローカル変数にロードしてそれを複数回使用する方が、フィールドに複数回アクセスするよりも高速でした(そして今でもJava ME AFAIKを使用しています)。
ただし、今日、この方法でローカル変数を使用すると、JITコンパイラが混乱する可能性があり、この方法でローカル変数を使用すると、処理速度が低下する可能性があります。
それはあなたの目標次第です。パラメータとして渡されたオブジェクトを変更したい場合は、参照されたオブジェクトの型の新しいインスタンスを作成しません。
それ以外の場合は、渡されたオブジェクトへの変更を気にせずに自由に変更できる新しいインスタンスを作成します。これは、マルチスレッド アプリケーションで一般的に使用されます。
すでに受け入れられている回答がありますが、このコンテキストでは使用がより理にかなっています。
private Class<?> clazz = ...;
public void foo() {
Class<?> current = clazz;
while (current != Object.class) {
// do some stuff.
current = current.superclass();
}
}
この例では、常に「現在」を新しい値に再割り当てしています。変数を使用しない場合の副作用を想像してみてください。
clazz = clazz.superclass();
メソッドに対してローカルではなく、オブジェクト自体のフィールドを変更するため、「foo」を繰り返し呼び出すと、期待する動作が見られません。
次のように使用しても意味がありません。
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));
intのようなプリミティブ型の場合、ポインターではなく値を処理しているため、メソッド「print」を呼び出した後も元の配列は変更されません。ただし、配列には当てはまりません