【问题标题】:May expose internal representation by incorporating reference to mutable object [duplicate]可以通过合并对可变对象的引用来公开内部表示[重复]
【发布时间】:2014-09-11 14:35:32
【问题描述】:

我的代码中有以下内容: 但是为什么这会产生声纳错误?在线错误: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;


    }
}

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    由于Date 是可变类型,将Date 传递给您的代码可以在将其传递给您的函数/构造函数后继续对其进行修改。

    因此,您不应只分配传递给您的Date,而应复制它以防止这种情况发生:

           this.lastAccessTime = new Date(lastAccessTime.getTime());
    

    这在 Joshua Bloch 的 Effective Java: Second Edition 中作为第 39 条:在需要时制作防御性副本

    请注意,您也应该在对日期进行任何验证之前制作此副本。
    编辑:如下所述,应在复制之前进行空检查以防止出现NullPointerException,但应在复制后进行其他验证。

    【讨论】:

    • 感谢您的提示。当您说“在进行任何验证时制作此副本”时,您是指我的 lastAccessTime 的 getter 和 setter 吗?例如我的设置器是: this.lastAccessTime = lastAccessTime == null ? null : 新日期(lastAccessTime.getTime());
    • 好吧,null 检查仍然必须先完成(或者你会得到一个NullPointerException),但我想更多的是你是否需要验证日期是否在之前或在其他日期之后。这实际上也包含在我参考的书中。
    • 好的,所以如果我稍后在这个日期的代码中进行验证,我也应该复制它
    【解决方案2】:

    由于java.util.Date 是可变类型,因此将java.util.Date 传递给您的代码可以在将其传递给您的函数/构造函数后继续对其进行修改。

    考虑重构为不可变类型,即org.joda.time.DateTime

    这在 Joshua Bloch 的 Effective Java: Second Edition 中作为第 15 条:最小化可变性。

    注意:看起来你正在做一些 ORM 的事情。 jadira 可以为休眠执行映射到 joda 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2013-09-28
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2014-01-06
      • 2023-01-27
      相关资源
      最近更新 更多