gpt4 book ai didi

java - Java 中的不可变关键字是个好主意吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:50:54 24 4
gpt4 key购买 nike

一般来说,我在 Java 中使用不可变对象(immutable对象)越多,我就越认为它们是个好主意。它们有很多优点,从自动线程安全到无需担心克隆或复制构造函数。

这让我开始思考,“不可变”关键字会出错吗?显然,在语言中添加另一个保留字存在缺点,我怀疑它是否会真正发生主要是出于上述原因 - 但忽略了我真的看不到很多缺点。

目前必须非常小心地确保对象是不可变的,即便如此,一个狡猾的 javadoc 注释声称组件对象是不可变的,而实际上它是不可变的,这可能会破坏整个事情。还有一种观点认为,即使像字符串这样的基本对象也不是真正不可变的,因为它们很容易受到反射攻击。

如果我们有一个不可变的关键字,编译器肯定可以递归地检查并给出一个铁定的保证,一个类的所有实例都是不可变的,这是目前无法做到的。特别是随着并发越来越多的使用,我个人觉得加个关键字来达到这个效果就好了。但是,是否有任何缺点或我遗漏的实现细节使这成为一个坏主意?

最佳答案

一般来说,不可变对象(immutable对象)应该优先于有状态对象和 it's currently fairly difficult to make an immutable object in Java 。事实上,大多数 OO 语言对不可变对象(immutable对象)的支持很差,而大多数函数式语言则认为这是理所当然的,例如 F#、Haskell 和 Clojure。

向 Java 添加不可变关键字可以使代码...

  • 更容易写。不会混淆 finalprivate,不会意外添加使类可变的方法,也不会手动标记类 final ( subclasses can add mutable state ) .
  • 更易于阅读。您不需要用英语 说类是不可变的,您可以在代码本身中说。不可变关键字是向自文档化代码迈出的重要一步。
  • 更快(理论上)。编译器对您的代码了解得越多,它可以进行的优化就越多。如果没有这个关键字,每次调用 new ImmutableFoo(1, 2, 3) 都必须创建一个新对象,除非编译器可以证明你的类不能被改变。如果 ImmutableFoo 标有 immutable 关键字,则每次此类调用都可能返回相同的对象。我很确定 new 必须总是创建一个新对象,这使得这一点无效,但与编译器的有效沟通仍然是一件好事。

Scala's case classes are similar to an immutable keyword. C# 5 中还考虑了不可变关键字。

关于java - Java 中的不可变关键字是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4675595/

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