在 Java 中使用 getter 函数返回可变成员变量 (Date/Timestamp)?

Returning mutable member variables (Date/Timestamp) using getter functions in Java?

我有一个 java class:

class MyObj{
  private Timestamp myDate;

  public  Timestamp getMyDate(){ 
       return mydate;
  }
  ...
}

当我通过 Findbugs 检查它时,它说:

Bug kind and pattern: EI - EI_EXPOSE_REP May expose internal representation by returning reference to mutable object

那么,在 Java 中为 DateTimestamp 类型编写 getter 的更好方法是什么?

Return 防御性副本而不是原始副本,以便 getter 访问者无法修改您的实际时间戳。

 public Timestamp getMyDate(){ 
       return new Timestamp(mydate.getTime());
  }

DateTimestamp 都是可变的,因此返回对 Timestamp 的引用意味着调用者可以更改 class 的内部状态。如果这是一个问题,那只是一个问题,如果这是有道理的;如果你意味着调用者能够修改你的对象的状态(通过修改你返回的实例字段的状态),那没关系,尽管它可以是源相对微妙的错误。但是,通常情况下,您并不意味着允许调用者这样做;因此 FindBugs 将其标记出来。

如果您想避免公开对可变对象的引用,您有几个选择:

  1. 返回对象时克隆对象 (a "defensive copy"),以便调用者获得副本,而不是原始对象:

    public Timestamp getMyDate(){ 
         return new Timestamp(mydate.getTime());
    }
    
  2. Return 不可变类型或原始类型而不是可变类型,例如:

    public long getMyDate(){ 
         return mydate.getTime();
    }
    
  3. 根本不要使用可变对象。例如,您可以使用 java.time 中的 LocalDateTimeZonedDateTime,而不是 Timestamp,例如:

    class MyObj{
      private LocalDateTime myDate;
    
      public LocalDateTime getMyDate(){ 
           return mydate;
      }
      // ...
    }
    

    如果您需要更新 class 中的日期(让我们使用添加一天的示例),而不是改变对象,您可以将其替换为一个新对象:

    this.mydate = this.myDate.plusDays(1);