gpt4 book ai didi

java - 使用 Java 中的 getter 函数返回可变成员变量(日期/时间戳)?

转载 作者:行者123 更新时间:2023-12-02 08:48:07 26 4
gpt4 key购买 nike

我有一个java类:

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

那么,什么是更好的写法 getter对于 DateTimestamp Java 中的类型?

最佳答案

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

如果您想避免暴露对可变对象的引用,您有多种选择:

  1. 在返回对象时克隆该对象(“防御性副本”),以便调用者获得副本,而不是原始对象:

    public Timestamp getMyDate(){ 
    return new Timestamp(mydate.getTime());
    }
  2. 返回不可变类型或基元而不是可变类型,例如:

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

    class MyObj{
    private LocalDateTime myDate;

    public LocalDateTime getMyDate(){
    return mydate;
    }
    // ...
    }

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

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

关于java - 使用 Java 中的 getter 函数返回可变成员变量(日期/时间戳)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45050480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com