将类变量引用到局部变量

时间:2012-06-27 15:06:13

标签: java

为什么有些人在方法中对字段变量进行新的引用?

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?
    }
}

6 个答案:

答案 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”之后,你的原始数组仍然是不受影响的。虽然对于数组

,但它并不成立