首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Java包装类是不可变的?

为什么Java包装类是不可变的?
EN

Stack Overflow用户
提问于 2012-09-11 21:13:08
回答 8查看 25.1K关注 0票数 24

我知道适用于一般不可变类的常见原因,即

  1. 不能更改为副作用
  2. 易于推断其状态
  3. 固有的线程安全
  4. 无需提供克隆/复制构造函数/工厂复制方法

<代码>H19实例缓存<代码>H210<代码>H111无需防御性副本<代码>H212<代码>G213

但是,包装器类表示基元类型,基元类型是可变的。那么为什么包装器类不是可变的呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-09-11 21:15:41

然而,包装器类表示基元类型,基元类型(字符串除外)是可变的。

首先,字符串不是原始类型。

其次,谈论原始类型是可变的是没有意义的。如果您像这样更改变量的值:

int x = 5;
x = 6;

这不是改变数字5-它改变的是x的值。

虽然包装器类型可以变,但在我看来,这样做会很烦人。我经常使用这些类型的只读集合,并且不希望它们是可变的。有时我想要一个可变的等价物,但在这种情况下,想出一个或使用Atomic*类就足够简单了。

我发现自己更希望DateCalendar是不变的,而不是希望Integer是可变的……(当然,我通常使用Joda时间,但Joda时间的好处之一是不变性。)

票数 32
EN

Stack Overflow用户

发布于 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
票数 12
EN

Stack Overflow用户

发布于 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都指向相同的整数对象。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12370544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档