21

Java で getter メソッドを使用することについて質問があります。このクラスがあるとします:

class Test {
    private ArrayList<String> array = new ArrayList<String>();

    public ArrayList getArray() {
        return this.array;
    }

    public void initArray() {
        array.add("Test 1");
        array.add("Test 2");
    }
}

class Start {
    public static void main(String args[]) {
        initArray();
        getArray().remove(0);
    }
} 

私の質問は:

実際の arraylist オブジェクトは変更されますか ("Test 1" が削除されます)。これはどこかで見たことがあると思いますが、ゲッターは単にそのオブジェクトのコピーを提供しているだけだと思いました。それへの参照ではありません。(参照として) そのように機能した場合、これも同様に機能します (クラス Test の arraylist オブジェクトもこれによって変更されますか?):

class Start {
    public static void main(String args[]) {
        initArray();
        ArrayList aVar = getArray();
        aVar.remove(0);
    }
} 
4

6 に答える 6

28

Java は配列への参照を返すため、コピーではなく、リストを変更します。一般に、プリミティブ型 ( 、など) でない限りintfloatオブジェクトへの参照を取得します。

複製を返す場合は、配列を自分で明示的にコピーする必要があります。

于 2013-06-04T21:31:54.933 に答える
2

私が理解しているように、オブジェクト参照変数は、オブジェクト自体のメモリ アドレスにすぎません。したがって、getArray() から返されるのは、その ArrayList への参照変数です。オブジェクトには多くの参照変数がある場合がありますが、変更されるのは同じオブジェクトです。

Java はすべて値渡しを行います。したがって、オブジェクト参照変数をパラメーターとして渡したり、その値を返したりするときはいつでも、オブジェクト参照変数の値を渡したり返したりしています。

于 2013-06-04T21:39:20.660 に答える
1

指摘したように、ゲッターはリストを変更せず、リストへの変更可能な参照を返します。Findbugs のようなツールはそれについて警告します... それを受け入れて、クラスのユーザーがリストを破壊しないことを信頼するか、これを使用してリストへの変更不可能な参照を返すことができます。

public static List<String> getArray() {
            return Collections.unmodifiableList(array);
        }
于 2013-06-04T22:00:40.780 に答える