为什么有些人在方法中对字段变量进行新的引用?
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?
}
}
答案 0 :(得分:5)
例如,如果在代码的其他位置更改mFoo的值,则可能是个好主意。特别是在多线程环境中,您需要确保仍在使用正确的数据。
答案 1 :(得分:3)
过去情况(仍然是Java ME AFAIK)将字段加载到局部变量并多次使用它比多次访问字段要快。
但是,今天使用局部变量这种方式可能会混淆JIT编译器并使用局部变量这种方式可能会更慢。
答案 2 :(得分:2)
这取决于你的目标。如果要修改作为参数传入的任何Object,则不会创建引用的Object类型的新实例。
否则你会创建一个新的实例,你可以自由修改而不必担心对传入的Object进行修改。这通常用于多线程应用程序。
答案 3 :(得分:2)
已经有一个已接受的答案,但在这种情况下使用更有意义:
private Class<?> clazz = ...;
public void foo() {
Class<?> current = clazz;
while (current != Object.class) {
// do some stuff.
current = current.superclass();
}
}
在此示例中,您不断地将“当前”重新分配给新值。想象一下没有变量的副作用,如果你继续这样做:
clazz = clazz.superclass();
您将更改对象本身的字段,而不是本地更改方法,因此重复调用“foo”将不会显示您期望的行为。
答案 4 :(得分: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));
答案 5 :(得分:0)
对于像 int 这样的基本类型,你要处理的是值,而不是指针,所以在调用方法“print”之后,你的原始数组仍然是不受影响的。虽然对于数组
,但它并不成立