我的代码中包含以下内容:
但为什么这会给Sonar错误?错误在线:this.lastAccessTime = lastAccessTime;
此处的日期已被声明为私有。
public class myClass{
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "LAST_ACCESS_TIME", nullable = false)
private Date lastAccessTime;
/**
* Constructor
*
* @param userId the user id
* @param screenName the name of screen
* @param lastAccessTime time of last access
*/
public userTO(String userId, String screenName, Date lastAccessTime)
{
this.userId = userId;
this.screenName = screenName;
this.lastAccessTime = lastAccessTime;
}
}
答案 0 :(得分:3)
由于Date
是一个可变类型,传递给Date
的代码可以在将它传递给函数/构造函数后继续修改它。
所以,不应只是分配传递给你的Date
,而应该复制它以防止这种情况发生:
this.lastAccessTime = new Date(lastAccessTime.getTime());
Joshua Bloch在Effective Java: Second Edition中介绍了项目39:在需要时制作防御性副本。
请注意,您还应在对日期进行任何验证之前制作此副本
编辑:如下所述,应在复制之前进行空检查以防止NullPointerException
,但在进行复制后应进行其他验证。
答案 1 :(得分:0)
由于java.util.Date
是一个可变类型,传递给java.util.Date
的代码可以在将它传递给函数/构造函数后继续修改它。
考虑重新分解为不可变类型,即org.joda.time.DateTime
Joshua Bloch在Effective Java: Second Edition中将其作为第15项:最小化可变性。
注意:看起来你正在做一些ORM的事情。 jadira可以执行到hibernate的joda类的映射。