为什么像java中的布尔类包装类是不可变的?

时间:2013-03-04 03:43:22

标签: java immutability

我看不出布尔包装器类成为不可变的原因。

为什么布尔包装器没有像Commons lang中的MutableBoolean那样实现,实际上可以重置。

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

4 个答案:

答案 0 :(得分:13)

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

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

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

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

此外,对于Boolean - 我要求您命名一个您可能想要执行的操作,该操作关注布尔值是否可变。设为真吗?使用myBool = true。这是重新分配,而不是变异。否定? myBool = !myBool。同样的规则。请注意,不变性是一个功能,而不是一个约束,所以如果可以提供它,你应该 - 在这些情况下,你当然可以。

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

答案 1 :(得分:3)

Java中的包装类是不可变的,因此运行时只能有两个布尔对象 - 一个用于true,一个用于false - 每个变量都是对这两个中的一个的引用。因为它们永远不会被改变,你知道它们永远不会被从你身下拉出来。这不仅可以节省内存,而且还可以让您的代码更易于推理 - 因为您知道的包装类永远不会改变它们的价值,因此它们不会突然跳到新值#39;意外地在其他地方引用相同的值。

类似地,Integer具有所有有符号字节值的缓存 - -128到127 - 因此运行时不必具有那些常见Integer值的额外实例。

答案 2 :(得分:1)

Patashu是最接近的。 Java中许多愚蠢的设计选择都是因为他们实现VM的方式有限。我认为最初他们试图为C或C ++制作一个虚拟机,但它太难了(不可能?)所以制作了另一个类似的语言。写一个,到处跑! 任何计算机技术证明都像其他人一样狡猾,这只是事后的事情。正如您现在所知,Java和C#正在发展成与C一样强大。当然,它们更清晰。应该是十年后设计的语言! 简单的诀窍是建立一个"持有者"类。或者现在使用封闭装置!也许Java正在发展成为JavaScript。 LOL。

答案 3 :(得分:0)

布尔值或任何其他包装类在java中是不可变的。由于包装类用作存储简单数据的变量,因此这些应该是安全的,并且必须保持数据完整性以避免不一致或不需要的结果。此外,不变性通过避免重复对象来节省大量内存。更多内容可以在文章Why Strings & Wrapper classes are designed immutable in java?

中找到