为什么Joda对象是不可变的?

Cor*_*ein 15 java jodatime

我已经读过,Java版本小于7,Joda Time对象比Java的内置函数更可靠.一个引用的原因是Joda对象是不可变的.为什么这有益?如果我想更改Joda DateTime对象的年,小时和时区,我需要制作三份副本!

Jon*_*eet 19

如果我想更改Joda DateTime对象的年,小时和时区,我需要制作三份副本!

确实是的.或者,您可以使用旧对象中的所有字段创建一个新对象,当然.

这是一件非常好的事情 - 因为这意味着当你想要依赖一个不改变的物体时,它就不会.考虑这个伪代码:

private static final Instant EARLIEST_ALLOWED_ARTICLE = ...;

private Instant creationTimestamp;

public Article(Instant creationTimestamp, ...) {
    if (creationTimestamp.isBefore(EARLIEST_ALLOWED_ARTICLE)) {
        throw new IllegalArgumetnException(...);
    }
    this.creationTimestamp = creationTimestamp;
    ...
}
Run Code Online (Sandbox Code Playgroud)

那很好,因为Instant是不可改变的.如果它是可变的,那么构造函数中的验证将毫无价值 - 除非你在那时创建了一个防御性副本.

根据我的经验,您希望传递引用并知道值的变化不会超过您想要实际更改现有对象的变化,因此不变性会导致更少的错误(使用可变对象可以忘记复制,以及任何验证都是无用的)并且制作的副本更少.

基本上,它允许您在本地推理您的代码,而无需复制您接受和存储的所有内容,或返回其他代码.当只有你的代码可以改变对象的状态时,弄清楚随着时间的推移会发生什么变得更加简单.

Joda Time实际上有些失败,因为它有可变类型不可变类型 - 如果你只是编程到接口(例如ReadableInstant)那么你就不会得到这些保证.这就是为什么在野田时间我把所有类型真正变成一成不变的原因.

出于兴趣,你想要String变得可变吗?如果没有,请尝试考虑两种方案之间是否存在实际差异.