我知道适用于一般不可变类的常见原因,即
<代码>H19实例缓存<代码>H210<代码>H111无需防御性副本<代码>H212<代码>G213
但是,包装器类表示基元类型,基元类型是可变的。那么为什么包装器类不是可变的呢?
发布于 2012-09-11 21:15:41
然而,包装器类表示基元类型,基元类型(字符串除外)是可变的。
首先,字符串不是原始类型。
其次,谈论原始类型是可变的是没有意义的。如果您像这样更改变量的值:
int x = 5;
x = 6;
这不是改变数字5-它改变的是x
的值。
虽然包装器类型可以变,但在我看来,这样做会很烦人。我经常使用这些类型的只读集合,并且不希望它们是可变的。有时我想要一个可变的等价物,但在这种情况下,想出一个或使用Atomic*
类就足够简单了。
我发现自己更希望Date
和Calendar
是不变的,而不是希望Integer
是可变的……(当然,我通常使用Joda时间,但Joda时间的好处之一是不变性。)
发布于 2012-09-11 21:22:53
对于某些类型,也有可变的、线程安全的包装器。
AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicLong
AtomicLongArray
AtomicReference - can wrap a String.
AtomicReferenceArray
外加一些异国情调的包装纸
AtomicMarkableReference - A reference and boolean
AtomicStampedReference - A reference and int
发布于 2012-09-11 21:21:07
这里有一个例子,当Integer是可变的时,它是非常糟糕的
class Foo{
private Integer value;
public set(Integer value) { this.value = value; }
}
/* ... */
Foo foo1 = new Foo();
Foo foo2 = new Foo();
Foo foo3 = new Foo();
Integer i = new Integer(1);
foo1.set(i);
++i;
foo2.set(i);
++i;
foo3.set(i);
现在foo1、foo2和foo3的值是什么?你会期望它们是1,2和3,但是当整数是可变的时,它们现在都是3,因为Foo.value
都指向相同的整数对象。
https://stackoverflow.com/questions/12370544
复制相似问题