Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止更改数组中的值_Java_Arrays - Fatal编程技术网

Java 防止更改数组中的值

Java 防止更改数组中的值,java,arrays,Java,Arrays,在我的程序中,我正在创建一个数组,其中包含年-月-日的值。我给他们赋值2019、6和17。到目前为止,程序允许我更改值,请参阅main中的注释。但我不希望这成为可能,我如何才能防止这一点 public static void main (String[] args) { Date date = new Date (2019, 6, 17); date.printDate (); int[] dateValue = date.get

在我的程序中,我正在创建一个数组,其中包含年-月-日的值。我给他们赋值2019、6和17。到目前为止,程序允许我更改值,请参阅main中的注释。但我不希望这成为可能,我如何才能防止这一点

    public static void main (String[] args)
    {
        Date date = new Date (2019, 6, 17);
        date.printDate ();

        int[] dateValue = date.getDate ();
        dateValue[2] = 35; //Changes the value from 17 to 35. Is not suppose to happen.

        date.printDate ();
    }
更改getDate以返回私有数组实例变量的副本:

public int[] getDate ()
{
  return Arrays.copyOf(ymd,ymd.length);
}
这样,方法的调用方就不能通过修改返回的数组来改变日期实例的状态。

更改getDate以返回私有数组实例变量的副本:

public int[] getDate ()
{
  return Arrays.copyOf(ymd,ymd.length);
}
这样,方法的调用者就不能通过修改返回的数组来改变日期实例的状态。

如下更改getDate:

public int[] getDate() {
    int[] newDate = new int[ymd.length];
    System.arraycopy(ymd, 0, newDate, 0, ymd.length);
    return newDate;
}
将getDate更改如下:

public int[] getDate() {
    int[] newDate = new int[ymd.length];
    System.arraycopy(ymd, 0, newDate, 0, ymd.length);
    return newDate;
}

详细说明一下:这就像使用公共setter方法返回对象一样。如果您允许某人直接访问您的对象,并且该对象允许任何人使用setter方法,那么任何人都可以随时更改您的对象。您可以按照建议返回一个副本,或者使用一个没有公共setter或不可变的不同对象来解决这个问题;详细说明一下:这就像使用公共setter方法返回对象一样。如果您允许某人直接访问您的对象,并且该对象允许任何人使用setter方法,那么任何人都可以随时更改您的对象。您可以按照建议返回一个副本,或者使用一个没有公共setter或不可变的不同对象来解决这个问题;这也行。