众所周知,Integer、Double、Boolean等类型包装器是不可变的.但是,我无法在官方API文档(如https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html )中找到这个文档。我还查看了源代码文件,但没有在评论中找到这一点。(另一方面,String源代码中的注释提到了它的不可变性。)
这是因为:
发布于 2017-08-24 07:31:40
值得考虑的是,不变可能意味着两件事:
( a)如果你把这个值传递给某些地方,它是不能变异的。
( b) "a“,并且可以安全地在多线程环境中使用。
ad )有些类是不可变的,但不是线程安全的,它们很适合与setters/getter一起使用,并在HashMap中用作键--这些类没有变异器,所有字段都是私有的,但没有所有字段最终或易失性。
广告B)有些类是不可变的和线程安全的--这些类没有变异器,所有字段都是私有的、最终的或易失性的。
线程安全的类通常在文档中被描述为如此,甚至用名称来描述,当然,有些类可以是不可变的和/或线程安全的,但是没有严格地记录下来。例如,String类被记录为“常量”,但没有关于线程安全性的信息--只有一条神秘语句“因为字符串对象是不可变的--它们可以共享”,但我认为它的含义与其他线程的...shared不同。我们只是知道流行类的属性,但我同意这些属性应该被清楚地记录下来。不幸的是,在现实生活中,它们不是这样的。因此,要知道类是否是不可变的,唯一的方法就是检查文档,如果没有足够的信息,那么检查执行情况,并询问作者是否计划在将来使类变。在实践中,这个主题在一本书中得到了考虑,作者建议使用两个注释来表示某些东西是@ThreadSafe和/或@Immutable,但不幸的是,这还不是一个常见的实践。
发布于 2017-08-24 07:12:56
装箱包装是“不可变的”,因为它们在语法上与它们包装的文字类型实际上是可互换的。例如,boolean是不可变的:
boolean x = false;
x.flip(); // not implemented在大多数编程语言中,本机类型是不可变的。因此,根据包装契约,
Boolean x = false;
x.mutate(/* ??? */);也没有定义。
https://stackoverflow.com/questions/45854892
复制相似问题