在 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 中为 Date
和 Timestamp
类型编写 getter
的更好方法是什么?
Return 防御性副本而不是原始副本,以便 getter 访问者无法修改您的实际时间戳。
public Timestamp getMyDate(){
return new Timestamp(mydate.getTime());
}
Date
和 Timestamp
都是可变的,因此返回对 Timestamp
的引用意味着调用者可以更改 class 的内部状态。如果这是一个问题,那只是一个问题,如果这是有道理的;如果你意味着调用者能够修改你的对象的状态(通过修改你返回的实例字段的状态),那没关系,尽管它可以是源相对微妙的错误。但是,通常情况下,您并不意味着允许调用者这样做;因此 FindBugs 将其标记出来。
如果您想避免公开对可变对象的引用,您有几个选择:
返回对象时克隆对象 (a "defensive copy"),以便调用者获得副本,而不是原始对象:
public Timestamp getMyDate(){
return new Timestamp(mydate.getTime());
}
Return 不可变类型或原始类型而不是可变类型,例如:
public long getMyDate(){
return mydate.getTime();
}
根本不要使用可变对象。例如,您可以使用 java.time
中的 LocalDateTime
或 ZonedDateTime
,而不是 Timestamp
,例如:
class MyObj{
private LocalDateTime myDate;
public LocalDateTime getMyDate(){
return mydate;
}
// ...
}
如果您需要更新 class 中的日期(让我们使用添加一天的示例),而不是改变对象,您可以将其替换为一个新对象:
this.mydate = this.myDate.plusDays(1);
我有一个 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 中为 Date
和 Timestamp
类型编写 getter
的更好方法是什么?
Return 防御性副本而不是原始副本,以便 getter 访问者无法修改您的实际时间戳。
public Timestamp getMyDate(){
return new Timestamp(mydate.getTime());
}
Date
和 Timestamp
都是可变的,因此返回对 Timestamp
的引用意味着调用者可以更改 class 的内部状态。如果这是一个问题,那只是一个问题,如果这是有道理的;如果你意味着调用者能够修改你的对象的状态(通过修改你返回的实例字段的状态),那没关系,尽管它可以是源相对微妙的错误。但是,通常情况下,您并不意味着允许调用者这样做;因此 FindBugs 将其标记出来。
如果您想避免公开对可变对象的引用,您有几个选择:
返回对象时克隆对象 (a "defensive copy"),以便调用者获得副本,而不是原始对象:
public Timestamp getMyDate(){ return new Timestamp(mydate.getTime()); }
Return 不可变类型或原始类型而不是可变类型,例如:
public long getMyDate(){ return mydate.getTime(); }
根本不要使用可变对象。例如,您可以使用
java.time
中的LocalDateTime
或ZonedDateTime
,而不是Timestamp
,例如:class MyObj{ private LocalDateTime myDate; public LocalDateTime getMyDate(){ return mydate; } // ... }
如果您需要更新 class 中的日期(让我们使用添加一天的示例),而不是改变对象,您可以将其替换为一个新对象:
this.mydate = this.myDate.plusDays(1);