可以通过合并对可变对象的引用来公开内部表示

时间:2014-09-11 14:35:32

标签: java sonarqube

我的代码中包含以下内容: 但为什么这会给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;


    }
}

2 个答案:

答案 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类的映射。