我只是想知道使下面的代码成为不可变的正确方法是什么。
Date d = new Date();
Scheduler.scheduleTask(task1, d);
d.setTime(d.getTime() + ONE_DAY);
Scheduler.scheduleTask(task2, d);
答案 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());