我看不出布尔包装类成为不可变的原因。
为什么 Boolean Wrapper 没有像 Commons lang 中的 MutableBoolean 那样实现,实际上可以重置。
有没有人对此有任何想法/理解?谢谢。
我看不出布尔包装类成为不可变的原因。
为什么 Boolean Wrapper 没有像 Commons lang 中的 MutableBoolean 那样实现,实际上可以重置。
有没有人对此有任何想法/理解?谢谢。
因为2
是 2。不会是3
明天。
不可变总是首选作为默认值,尤其是在多线程情况下,它使代码更易于阅读和维护。一个很好的例子:Java Date
API,它充满了设计缺陷。如果Date
是不可变的,API 将会非常精简。我会知道Date
操作会创建新的日期,并且永远不必寻找修改它们的 API。
阅读Concurrency in Practice以了解不可变类型的真正重要性。
但还要注意,如果由于某种原因你想要可变类型,使用AtomicInteger
AtomicBoolean
等。为什么Atomic
?因为通过引入可变性,您引入了对线程安全的需求。如果您的类型保持不可变,您将不需要它,因此在使用可变类型时,您还必须为考虑线程安全和使用concurrent
包中的类型付出代价。欢迎来到并发编程的美妙世界。
另外,对于Boolean
- 我挑战你说出一个你可能想要执行的操作,它关心 Boolean 是否是可变的。设置为真?使用myBool = true
. 那是重新分配,而不是突变。否定? myBool = !myBool
. 同样的规则。请注意,不变性是一个特性,而不是一个约束,所以如果你能提供它,你应该 - 在这些情况下,你当然可以。
请注意,这也适用于其他类型。整数最微妙的事情是count++
,但这只是count = count + 1
,除非您关心以原子方式获取值......在这种情况下使用 mutable AtomicInteger
。
Java 中的包装类是不可变的,因此运行时只能有两个布尔对象——一个代表真,一个代表假——每个变量都是对这两个对象之一的引用。而且由于它们永远无法更改,因此您知道它们永远不会从您的身下被拉出来。这不仅可以节省内存,还可以让你的代码更容易推理——因为你知道的包装类永远不会改变它们的值,它们不会突然跳转到一个新值,因为它们是意外的在其他地方引用相同的值。
同样,Integer 具有所有带符号字节值的缓存 - -128 到 127 - 因此运行时不必具有这些常见 Integer 值的额外实例。
Patashu 是最接近的。Java 中许多愚蠢的设计选择是因为它们实现 VM 的方式受到限制。我认为最初他们试图为 C 或 C++ 制作一个 VM,但它太难了(不可能?)所以制作了另一种类似的语言。写一个,到处跑!任何像其他家伙喷出的计算机科学理由都是事后的文件夹。如您所知,Java 和 C# 正在演变为与 C 一样强大。当然,它们更简洁。应该适用于十年后设计的语言!简单的技巧是创建一个“持有人”类。或者现在使用闭包!也许 Java 正在演变成 JavaScript。哈哈。
布尔值或任何其他包装类在 java 中是不可变的。由于包装类用作存储简单数据的变量,因此它们应该是安全的,并且必须保持数据完整性以避免不一致或不需要的结果。此外,不变性通过避免重复对象来节省大量内存。更多内容可以在文章Why Strings & Wrapper classes are designed immutable in java? 中找到。