gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:04:21 25 4
gpt4 key购买 nike

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

最佳答案

If I want to change the year, hour, and timezone of a Joda DateTime object, I need to make three copies!

是的,的确如此。当然,您也可以创建一个新对象,使用您喜欢的旧对象中的所有字段。

这是一件非常好的事情——因为这意味着当你想依赖一个不变的对象时,它不会。考虑这个伪代码:

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;
...
}

没关系,因为 Instant 是不可变的。如果它是可变的,则构造函数中的验证将毫无值(value) - 除非您在此时创建了一个防御性副本。

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

基本上,它允许您在本地推理您的代码,而无需复制您接受和存储的所有内容,或返回到其他代码。当只有您的代码可以更改您的对象的状态时,计算出随着时间的推移会发生什么就容易多了。

Joda Time 实际上有些失败,因为它同时具有可变的 不可变类型 - 如果您只是针对 接口(interface)(例如 ReadableInstant)进行编程,那么你得不到这些保证。这就是为什么在 Noda Time我使所有类型真正不可变。

出于兴趣,您希望 String 可变吗?如果不是,请尝试思考这两种情况之间是否存在真正的差异。

关于java - 为什么 Joda 对象是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12518654/

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