プライベートメンバーのためにのみ値を渡します

シャヒーンAhamed S:

私はそのプライベートメンバとゲッターとして1つの配列、そのためのsetterメソッドを持つクラスを作成しています。私は、主な機能の配列を使用してその配列に値を設定します。私は、主な機能の配列を操作すると、そのクラスの配列の存在に影響を与えるべきではありません。

私はこのコードを試してみましたが、ここで配列を操作します

class ClassB {

    private int[] a;

    ClassB() { }

    ClassB(int[] a) {
        this.a=a;
    }

    int[] geta() {
        return this.a;
    }

    void seta(int a[]) {
        this.a = a;
    }
}

public class ClassA{

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter size : ");
        int n = sc.nextInt();
        int[] d = new int[n];
        System.out.println("Enter array elements : ");
        for (int i=0 ; i<n ; i++) {
            d[i] = sc.nextInt();
        }
        final ClassB cb2 = new ClassB(d);
        d[3] = 15;
        System.out.println("After changing array d : \n Values of array d :");
        for (int i=0 ; i<n ; i++) {
            System.out.println(d[i]);
        }
        System.out.println("Values of array a of cb2 :");
        int[] b = cb2.geta();
        for (int i=0 ; i<n ; i++) {
            System.out.println(b[i]);
        }
    }
}

私が期待する :

Enter size :

5

Enter array elements :
1
2
3
4
5
After changing array d :

 Values of array d :

1
2
3
15
5

Values of array a of cb2 :
1
2
3
4
5

しかし、実際の出力されました:

Enter size :

5

Enter array elements :

1
2
3
4
5

After changing array d :

 Values of array d :

1
2
3
15
5

Values of array a of cb2 :

1
2
3
15
5
lealceldeiro:

あなたは作ることができます守備のコピーClassBあなたは、配列を設定したり、その値を返す必要があるたびに。このような:

class ClassB {
    // ... code omitted for brevity

    ClassB(int[] a) {
        seta(a);
    }

    int[] geta() {
        int[] copy = new int[a.length];
        System.arraycopy(a, 0, copy, 0, a.length);
        return copy;
    }

    void seta(int a[]) {
        this.a = new int[a.length];
        System.arraycopy(a, 0, this.a, 0, a.length);
    }
}

サイドノート

  • あなたが本当にしたい場合はClassB不変、あなたはその値のためのセッターを持つべきではありません。
  • ユーティリティは、System.arraycopy配列のコピーを作成するために使用されました。ここでは、より良いあなたのニーズに合ったものを使用してお気軽に(あなたが使用して検討する必要がありますa.clone()...これはそれについての良いトピックです:クローンは、()の配列をコピーするための最良の方法であるのはなぜ?)。

追加の測定値:

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202113&siteId=1