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 回答