首页 > 解决方案 > 如何防止更改数组或对象的值

问题描述

我是Java的初学者。在开发程序时,我创建了一个带有以变量作为参数的构造函数的对象。但是当我在创建对象后更改变量的值时,我的对象具有第二个值而不是第一个值。我不希望我的对象改变值。我该怎么办?

public class Person {

    public Person(int[] arrayTest) {
            this.arrayTest = arrayTest;
    }

    public int[] getArray() {
        return this.arrayTest;
    }

    public boolean canHaveAsArray(int[] arrayTest) {
            return true;
    }

    private int[] arrayTest = new int[2];

    public static void main(String[] args) {
        int[] array = new int[] {5, 10};
        Person obj1 = new Person(array);
        array[0] = 20;
        System.out.println(Arrays.toString(obj1.getArray()));
    }
}

我的输出应该是 [5, 10],但我得到的是 [20,10]。即使如上所示更改数组的元素,我也需要得到 [5,10] 。我应该怎么办?

标签: java

解决方案


如果将原始数组传递给 的构造函数Person,则将引用传递给原始数组。arrayTest所以内部实例的任何变化Person都会反映在原始数组(int[] array)中,反之亦然。

如果您不想更改Person实例中原始数组元素的值,那么您有两种选择:

  • 您可以修改Person构造函数中的代码以使用方法创建原始数组的副本,java.util.Arrays.copyOf然后使用该副本:

    public Person(int[] arrayTest) {
        this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length);
    }
    
  • 不要将原始数组传递给构造函数,而只需发送原始数组的副本:

    Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));
    

但是,我更喜欢第一种方法。


如果你想阻止原始类型的变量的值,你可以使用final关键字来做到这一点。例如:

private final int test = 1;

为防止更改对象内的值,您可以将字段标记为final。对象实例声明中的final关键字意味着不能重新分配变量,并且不保证如果对该对象的引用是共享的,则对象状态不会改变。为防止更改特定对象的状态,应将其字段标记为final.


推荐阅读