【问题标题】:How do I fix this Date class in such a way that date should not be able to change after it's initiated when creating a new Date instance?如何修复此 Date 类,以使日期在创建新 Date 实例时启动后不能更改?
【发布时间】:2020-02-09 11:42:24
【问题描述】:

下面是两段代码,我知道它没有按预期工作。 Date 实例在创建后不应更改,但因为getDate 方法返回一个数组(引用),所以它可以在我提供的代码的第二部分中使用int[] dateValue = date.getDate (); 进行更改。

我想我有点想多了,需要用新的眼光来看待这个问题。 我只是应该使用int y, int m, int d 而不是int[] ymd 构建Date-class,还是可以修改返回方法和/或向DateProblem2 添加更多方法?

关于如何以最佳或最简单的方式解决此问题的任何想法? Problem2 类应该两次打印出相同的内容,和/或 Date-instance 不应更改!

至于现在,我什至不知道我应该往哪个方向思考。

public class Date
{
  private int[] ymd = new int[3];

  public Date (int year, int month, int day)
  {
    ymd[0] = year;
    ymd[1] = month;
    ymd[2] = day;
  }

  public int[] getDate ()
  {
    return ymd;
  }

  public void printDate ()
  {
    System.out.println (ymd[0] + "-" + ymd[1] + "-" + ymd[2]);
  }
}


public class Problem2
{
  public static void main (String[] args)
  {
    Date date = new Date (2019, 6, 15);
    date.printDate ();
    int[] dateValue = date.getDate ();
    dateValue[2] = 38;
    date.printDate ();
  }
}

目前,Problem2 打印出来:

2019-6-15
2019-6-38

当“固定”时,它应该两次打印相同的日期。

【问题讨论】:

  • 您可以返回数组的克隆。

标签: java arrays class instance return-value


【解决方案1】:

要使对象不可变,您应该在getDate() 方法中返回数组的副本。 为此,您可以将方法替换为:

public int[] getDate ()
{
    return Arrays.copyOf(ymd, ymd.length);
}

Arrays.copyOf 将数组及其长度作为参数。它返回数组的副本。

【讨论】:

  • 谢谢,这行得通:) 但是有没有其他方法,不用java.util.Arrays
  • 如果我使用它会返回什么类型的值? Arrays.copyOf
  • @Calle654 它返回参数中给出的相同内容,但返回一个副本。在这种情况下,它将是 int[] 因为 ymd 是 int[] ...
  • @Calle654 如果不想使用java.util.Arrays,仍然可以手动复制数组。像这样:public int[] getDate () { return new int[]{ymd[0], ymd[1], ymd[2]}; }
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 2015-11-24
  • 2020-10-29
  • 1970-01-01
  • 2012-09-14
  • 2016-05-03
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多