Java 可变日期类修复

Java 可变日期类修复,java,immutability,Java,Immutability,我只是想知道什么是使下面的代码不可变的正确方法 Date d = new Date(); Scheduler.scheduleTask(task1, d); d.setTime(d.getTime() + ONE_DAY); Scheduler.scheduleTask(task2, d); 你不能让它一成不变。不变性是对象的属性。它说,一旦实例化,对象的内部状态就不会改变 不管出于什么原因,这个类并不是设计成不可变的。可以通过更改其包含的值来很好地说明这一点: d.setTime(d.get

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

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

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

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

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
。在Java 8中添加了一个位于
Java.time
。位于其中的类是不可变的,通常是更好的选择。

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

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

“不可变代码”是什么意思?您的意思是使
日期
实例不可变吗?是的。日期本质上是可变的,不是吗?那么,如何使上面的代码不可变呢。可能是一个日期实例吗yes@GreenCoder你的问题还不清楚:有些代码不是可变的或不可变的——类可以是可变的。你想要实现什么?为什么你想要不变性?这只是我这里的一个问题。检查代码,详细列出可能存在的潜在问题,并提出解决方案。谢谢。我明白你的意思。@GreenCoder没问题。我只是添加了一些关于Java8中添加的新日期/时间的内容。我现在可以理解这个问题了。代码对两个任务使用相同的日期实例,这可能会导致并发问题。是的。根据调度程序的工作方式,您可能会在第二个任务的时间完成这两个任务。我理解。谢谢你的解释@Michael。