可变日期类修复

时间:2017-05-04 10:25:19

标签: java immutability

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

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

2 个答案:

答案 0 :(得分:1)

你无法做到这一点。 Immutability是对象的属性。它说,一旦实例化,对象的内部状态就不会改变。

java.util.Date类,无论出于何种原因,都不是为了不可变。通过更改其包含的值的能力很好地说明了这一点:

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.time的Java 8中添加了new Date/Time API。位于那里的类是不可变的,通常是更好的选择。

答案 1 :(得分:0)

Date对象实现了clone方法,因此您可以克隆日期(d)对象而不是引用。在你的例子中会是这样的:

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