一直试图找到实现生成Calendar对象的防御性副本的方法的最佳方法。
例如:
public void setDate(Calendar date) {
// What to do....
}
当检查空输入并进行复制时,我特别担心线程的交错,还是我遗漏了一些明显的东西?
最佳答案
(我想现在是针对稍微不同的受众群体的...)
如果我绝对必须使用clone()
(而不是Joda Time),我将使用Calendar
。您在评论中辩称,您担心“顽皮的子类”-您打算如何在任何方案中解决该问题?如果您对所涉及的子类一无所知,并且不信任它们,那么您将无法保留特定于类型的数据。如果您不信任子类不要搞乱事情,那么通常您会遇到更大的问题。在执行日期/时间计算时,您如何信任它为您提供正确的结果?clone()
是克隆对象的预期方式:这是我希望明智的子类挂接到所需的任何特定于类型的行为的地方。您不需要知道哪些状态是相关的-只需让类型本身处理即可。
优于使用Calendar.getInstance()
和自行设置属性:
编辑:在原始问题担心的“线程交织”方面:
date
参数的值不会更改任何其他线程。但是,如果在您进行防御性复制时另一个线程正在使对象的内容发生变异,则很容易引起问题。如果存在风险,那么基本上您会遇到更大的问题。关于java - 日历的防御性副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9224935/