如何使这个类完全不可变?

时间:2017-05-04 20:04:06

标签: java immutability

public final class Test {

    private final Date date;

    public Test() {
        date = new Date();
    }

    public Test(Date date) {
        this.date = date;
    }

    public Date getDate() {
        return date;
    }

    public String toString() {
        return "Test:[date=" + date.toString() + "]";
    }
}

2 个答案:

答案 0 :(得分:6)

您的课程实例本身无法更改,但由于Date是可变的(假设它是java.util.Date),因此可以更改其中的信息。

例如:

myTest.getDate().setTime(0L);

如果你想防范这种情况,你需要防御性地复制Date

public Test(Date d) {
    this.date = new Date(d.getTime());
}
public Date getDate() {
    return new Date(this.date.getTime());
}

这样,班级外的任何人都无法访问您的date字段来改变它。

或者,使用不可变日期类型,例如LocalDateLocalDateTime,而不是可变日期类型。

答案 1 :(得分:0)

返回日期对象的克隆。

public final class Test {

  private final Date date;

  public Test() {
    date = new Date();
  }

  public Test(Date date) {
    this.date = (Date)date.clone();
  }

  public Date getDate() {
    return (Date)date.clone();
  }

  public String toString() {
    return "Test:[date=" + date.toString() + "]";
  }
}

如果您对创建新对象有性能问题,则可以将时间存储为long而不是Date对象。