有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可变日期类修复

我只是想知道什么是使下面的代码不可变的正确方法

Date d = new Date();
Scheduler.scheduleTask(task1, d);
d.setTime(d.getTime() + ONE_DAY);
Scheduler.scheduleTask(task2, d);

共 (2) 个答案

  1. # 1 楼答案

    你不能让它一成不变。不变性是对象的属性。它说,一旦实例化,对象的内部状态就不会改变

    不管出于什么原因,^{}类并不是设计为不可变的。可以通过更改其包含的值来很好地说明这一点:

    d.setTime(d.getTime() + ONE_DAY);
    

    如果您想更改代码,使其不会变异此对象,您可以执行以下操作:

    Date firstDate = new Date();
    Scheduler.scheduleTask(task1, firstDate);
    Date secondDate = new Date(firstDate.getTime() + ONE_DAY);
    Scheduler.scheduleTask(task2, secondDate);
    

    如果可以避免,请不要使用java.util.Date。Java8中添加了一个new Date/Time API,位于java.time。位于其中的类是不可变的,通常是更好的选择

  2. # 2 楼答案

    日期对象实现了克隆方法,所以您可以克隆日期(d)对象,而无需进行引用。在您的示例中,将如下所示:

    Date d = new Date();
    Scheduler.scheduleTask(task1, (Date) d.clone());
    d.setTime(d.getTime() + ONE_DAY);
    Scheduler.scheduleTask(task2, (Date) d.clone());