可变日期 class 修复
Mutable Date class fix
我只是想知道使下面的代码不可变的正确方法是什么。
Date d = new Date();
Scheduler.scheduleTask(task1, d);
d.setTime(d.getTime() + ONE_DAY);
Scheduler.scheduleTask(task2, d);
你不能让它不可变。不变性是对象的属性。它说,一旦实例化,对象的内部状态就不会改变。
java.util.Date
class,无论出于何种原因,并非设计为不可变的。更改它包含的值的能力很好地说明了这一点:
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。位于其中的 classes 是不可变的,通常是更好的选择。
日期对象实现了克隆方法,因此您可以克隆您的日期 (d) 对象而不是进行引用。在你的例子中是这样的:
Date d = new Date();
Scheduler.scheduleTask(task1, (Date) d.clone());
d.setTime(d.getTime() + ONE_DAY);
Scheduler.scheduleTask(task2, (Date) d.clone());
我只是想知道使下面的代码不可变的正确方法是什么。
Date d = new Date();
Scheduler.scheduleTask(task1, d);
d.setTime(d.getTime() + ONE_DAY);
Scheduler.scheduleTask(task2, d);
你不能让它不可变。不变性是对象的属性。它说,一旦实例化,对象的内部状态就不会改变。
java.util.Date
class,无论出于何种原因,并非设计为不可变的。更改它包含的值的能力很好地说明了这一点:
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。位于其中的 classes 是不可变的,通常是更好的选择。
日期对象实现了克隆方法,因此您可以克隆您的日期 (d) 对象而不是进行引用。在你的例子中是这样的:
Date d = new Date();
Scheduler.scheduleTask(task1, (Date) d.clone());
d.setTime(d.getTime() + ONE_DAY);
Scheduler.scheduleTask(task2, (Date) d.clone());