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

-2 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() + "]";
    }
}
Run Code Online (Sandbox Code Playgroud)

khe*_*ood 6

你的类的实例本身不能改变,但由于它Date是可变的(假设它是java.util.Date),它们内部的信息可以改变.

例如:

myTest.getDate().setTime(0L);
Run Code Online (Sandbox Code Playgroud)

如果你想要防范这一点,你需要Date防御性地复制.

public Test(Date d) {
    this.date = new Date(d.getTime());
}
public Date getDate() {
    return new Date(this.date.getTime());
}
Run Code Online (Sandbox Code Playgroud)

这样,课外的任何东西都无法访问你的date领域来改变它.

或者,使用不可变日期类型,例如LocalDateLocalDateTime代替可变日期类型.