众所周知,Integer
、Double
、Boolean
等类型包装器是不可变的。但是,我无法在官方 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/