java - Java 包装类的不可变性文档

标签 java immutability

众所周知,IntegerDoubleBoolean 等类型包装器是不可变的。但是,我无法在官方 API 文档中找到此记录,例如 https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html .我还查看了源代码文件,没有在评论中发现这一点。 (另一方面,String 源代码中的注释确实提到了它的不变性。)

这是因为:
- 它在别处记录(如果是,在哪里?),
——这个事实太“有名”了,还是
- 开发人员应该阅读包装器的实现并弄清楚包装器是否不可变?

最佳答案

值得考虑的是,不可变可能意味着两件事:

a) 如果你在某个地方传递这个值,它就不能被改变。

b) "a"并且可以在多线程环境中安全使用

ad A) 有些类只是不可变的但不是线程安全的,它们很适合与 setter/getter 一起使用并作为 HashMap 中的键 - 这些类没有修改器,所有字段都是私有(private)的但没有所有字段都是最终的或不稳定。

ad B) 有些类是不可变的和线程安全的 - 这些类没有修改器并且所有字段都是私有(private)的和最终的或易变的。

线程安全的类通常在文档中或什至按名称描述,当然有些类可以是不可变的和/或线程安全的,但没有严格记录。例如 String 类被记录为“常量”,但没有关于线程安全的信息——只有一个神秘的声明“因为 String 对象是不可变的,所以它们可以共享”,但我认为它意味着不同于...与其他线程共享的东西。我们只知道流行类的属性,但我同意应该清楚地记录这些属性。不幸的是,在现实生活中他们不是。所以知道类是否不可变的唯一方法是检查文档,如果没有足够的信息,然后检查实现并询问作者他是否计划在将来使类可变。这个主题在 Java Concurrency in Practice 一书中被考虑过,作者建议使用两个注释来表示某些东西是 @ThreadSafe 和/或 @Immutable 但不幸的是这是' 一种常见的做法。

关于java - Java 包装类的不可变性文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45854892/

相关文章:

java - 如何在 Clojure 中创建一个原始的二维 (2d) double 组?

java - 当我从 Excel 工作表读取 inf 时,无法按顺序打印 doc 文件中的信息

.net - F# : Is it okay to use mutable .Net List 将元素添加到同一列表

python - open(file, "wt"或 "rt") 是不同的对象吗?

java - 硬删除的对象仍然出现在 AppEngine 管理控制台中

java - 如何在Java中仅使用证书而不使用私钥来签署pdf文件?

Java 泛型,创建 Class<T> 的实例

python - 可散列的,不可变的

immutability - Kotlin 中带有 val 的循环引用

java - .NET Dictionary/IDictionary 的 Equals() 契约(Contract)与 Java Map 的 equals() 契约(Contract)