3

Netbeans 抱怨此代码出现在IDEA 代码检查列表中。

 public Date getStartDate()
 {
    return theStartDate;
 }

IDEA 网站 说:

此检查报告任何从方法返回 java.lang.Date 或 java.lang.Calendar 字段的尝试。由于 Date 或 Calendar 通常被视为不可变值,但实际上是可变的,因此此构造可能会导致对象的状态被意外修改。虽然出于性能原因偶尔有用,但这种构造本质上容易出错。

否则我将如何返回一个Date

4

5 回答 5

9

您很可能应该返回有问题的值的副本,而不是您当前的对象,以避免意外修改

最简单的可能是
return new Date(theStartDate.getTime());

这是因为 java.util.Date 是一个可变对象,您希望避免调用者错误地或恶意地执行以下操作出现问题:

yourObject.getStartDate().setTime(0);

如果您进行上述更改,则上述声明将变得无害。

为什么是复制构造函数而不是克隆方法?请参阅此处: java.util.Date 克隆或复制以不公开内部引用

请注意,这将对每次调用该方法时创建一个新对象造成性能损失,因此请谨慎使用。

于 2013-02-25T22:21:38.923 回答
2

return new Date(theStartDate.getTime());

于 2013-02-25T22:22:26.630 回答
2

IDEA 只是说 Date 对象通常用作不可变对象。合理的解决方案是返回一个新的 Date 对象,在它的构造函数中包含 theStartDate.getTime() 。这保持了原始 Date 对象的不变性:)

于 2013-02-25T22:22:44.227 回答
1

您可以将日期作为不可变的 long ( Date.getTime()) 返回。这确保了调用者不会更改日期。

另一种选择是将日期作为 long 并返回一个新日期return new Date(dateAsLong)。这将保护原始日期,同时仍返回 Date 对象。

于 2013-02-25T22:21:59.393 回答
1

也许您可以返回 代表的long毫秒值Date

public long getStartDateMilliseconds()
{
    return theStartDate.getTime();
}

返回long值仍然允许您返回Date信息,并防止调用者修改返回的Date. 然后调用者可以重新构造Date

Date theDate = new Date(myObject.getStartDateMilliseconds());

那应该通过 IntelliJ 检查。

于 2013-02-25T22:22:47.743 回答