0

を作成するメインメソッドがありますList<Long>。次に、状態が a である別のクラスがあります。List<Long>このクラスの目標は、メイン メソッドList<Long>を状態として取り込み、メイン メソッドの に影響を与えずにそれを操作することList<Long>です。

ただし、私が直面している問題は、この他のクラスがその状態 (その)メイン メソッドの両方に影響を与えることです。private List<Long>List<Long>

setTesting(...)クラスの状態にしか影響を与えないようにコードを調整するにはどうすればよいですか?

public class Main {
    public static void main(String[] args) { 

        final List<Long> mainlist = new ArrayList<Long>();
        mainlist.add((long) 1);
        mainlist.add((long) 2);
        mainlist.add((long) 3);


        Test testlist = new Test();
        testlist.setTesting(mainlist);

        System.out.println(testlist.getTesting());
        testlist.removal((long) 1);
        System.out.println(testlist.getTesting());



    }
}





public class Test {

    private List<Long> testing = new ArrayList<Long>();

    public Test() {
    }

    public void removal(Long remove) {
        this.testing.removeAll(Collections.singleton(remove));
    }

    public void setTesting(List<Long> list) {
        this.testing = list;
    }

    public List<Long> getTesting() {
        return this.testing;
    }



}
4

3 に答える 3

1

クラス内のtesting 参照はメイン メソッドで作成した同じリストを参照しているため、変更を加えるとメイン メソッド リストが変更されます。メソッドに渡されたリストを使用して新しいリストを作成する場合はsetTesting、次のようにします。

   public void setTesting(List<Long> list) {
        this.testing = new ArrayList<Long>(list);
    }

newキーワード inを使用setTestingすると、入力リストを使用して新しいリストが作成されます。この新しいリストを変更しても、元のメイン メソッド リストには影響しません。

また、クラス レベルからテスト リストの初期化を削除することもできます。宣言するだけです。

private List<Long> testing;
于 2013-09-14T06:21:18.213 に答える
1

防御コピーを作成します。

public void setTesting(List<Long> list) {
     this.testing = new ArrayList<Long>(list);
    }

現在の問題は、Testオブジェクトとmainメソッドの両方が同じリストを参照していることです。したがって、誰かがリストを変更すると、他の人がそれを見ることになります。解決策は、両方に異なるコピーを用意することです。

注意点: 上記の解決策では、新しいリストにも同じ参照がコピーされますが、ここでは問題ありません。

于 2013-09-14T06:21:44.947 に答える
1

これは、 が 1 つしかないために発生しList<Long>ます。classにmain渡すメソッドでは、 で作成されたリストへの参照を格納しているだけです。Java では、変数はオブジェクトへの参照であり、オブジェクト自体ではないことに注意してください。メソッドで行うようにを使用する場合、参照をリストにコピーするだけで、リストのコピーを作成することはありません。オブジェクトに独自のコピーが必要な場合は、自分でリストをコピーする必要があります。setTestingTestmain=setTestingTest

public void setTesting(List<Long> list) {
    // Creates a copy of the list
    this.testing = new ArrayList<Long>(list);
}
于 2013-09-14T06:23:56.437 に答える