【问题标题】:Is there a way to pass a copy of the object rather than reference to Java method [duplicate]有没有办法传递对象的副本而不是引用Java方法[重复]
【发布时间】:2015-10-02 16:45:00
【问题描述】:

也许有一种更聪明的方法可以解决我的问题,所以我的问题可能不会为您指明正确的思考方向。

但是,我的问题是我只想在程序开始时初始化我的 Calendar 实例一次,所以我只使用那个日期和时间。

然后我想将该日历传递给一个方法,该方法从中添加/减去一些月/日,并将该日期时间用于 API 调用。问题是,我想在我的应用程序的不同位置重用初始日期,但该方法不断改变我的 Calendar 实例。

代码:

在主线程开始处初始化Calendar

Calendar cal = Calendar.getInstance();

使用实例的方法:

private static String getDateUntil(int i, Calendar cal) {
    int month = 0 - i;
    //Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MONTH, month);
    Date result = cal.getTime();
    String dateUntil = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").format(result);

    return dateUntil;
}

调用此方法后,我的cal 被更改,无法重用初始日期时间。有什么想法吗?

【问题讨论】:

  • 您真的需要使用日历吗?从 Java 8 开始,我们有了相当不错的新时间 API。
  • 使用 java 8 的不可变 LocalDateTime 和 minusDays

标签: java calendar pass-by-reference pass-by-value


【解决方案1】:

在你的方法中使用克隆:

private static String getDateUntil(int i, Calendar cal) {
    int month = 0 - i;
    Calendar mycal = (Calendar)cal.clone();  // Make a copy of the initial instance
    mycal.add(Calendar.MONTH, month);
    Date result = mycal.getTime();
    String dateUntil = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").format(result);
    return dateUntil;
}

【讨论】:

  • 太糟糕了Calendar 类没有用类型协变覆盖clone() 的返回类型。
【解决方案2】:

使用 calendar.clone() 获取副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多