java - 为什么java中的Boolean这样的Wrapper类是不可变的?

标签 java immutability

我看不出为什么 boolean 包装类是不可变的。

为什么 Boolean Wrapper 没有像 Commons lang 中的 MutableBoolean 那样实现,实际上可以重置。

有没有人对此有任何想法/理解?谢谢。

最佳答案

因为2是2。明天不会是3

不可变始终是首选的默认值,尤其是在多线程情况下,它使代码更易于阅读和更易于维护。例证:Java Date API 充满了设计缺陷。如果 Date 是不可变的,那么 API 将会非常精简。我会知道 Date 操作会创建新日期,并且永远不必寻找修改它们的 API。

阅读并发实践,了解不可变类型的真正重要性。

但还要注意,如果出于某种原因您需要可变类型,请使用 AtomicInteger AtomicBoolean 等。为什么要使用 Atomic?因为通过引入可变性,您引入了对线程安全的需求。如果您的类型保持不可变,您将不需要它,因此在使用可变类型时,您还必须为考虑线程安全和使用 concurrent 包中的类型付出代价。欢迎来到美妙的并发编程世界。

另外,对于 Boolean - 我挑战你说出一个你可能想要执行的操作,它关心 Boolean 是否可变。设置为真?使用 myBool = true。那是重新分配,而不是突变。否定? myBool = !myBool。同样的规则。请注意,不变性是一个特性,而不是一个约束,因此如果您可以提供它,您应该提供它——在这些情况下,您当然可以。

请注意,这也适用于其他类型。整数最微妙的地方是 count++,但那只是 count = count + 1,除非你关心以原子方式获取值......在这种情况下使用可变原子整数

关于java - 为什么java中的Boolean这样的Wrapper类是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15194226/

相关文章:

java - 使用 Java 在 UNIX 上获取计算机 IP 的安全方法

java - 是否应该将 mvnw 文件添加到存储库中?

scala - Scala 中的非严格、不可变、非记忆化的无限系列

java - 集合在 Java 中是最终的是什么意思?

scala:如何避免在 try catch block 中使用可变参数

java - WAR 文件的启动 Servlet

java - webcontainer如何知道在客户端发送请求时要调用Servlet的哪个方法?

java - 我正在使用 .getRGB() 和 .setRGB() 来获取 BufferedImage 的一部分,如何复制透明度?

c# - 不可变类型是否适用于此缓存问题

python - 为什么 Python 字符串是不可变的?使用它们的最佳实践