一直试图找到实现生成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/

    10-11 18:06