为什么整数在Java中是不可变的?

Man*_*ani 13 java integer immutability

我知道整数在Java中是不可变的.但为什么这样设计呢?

在提出这个问题之前,我通过了其他答案:

整数是不可改变的

i ++仍在为Java中的不可变Integer工作?

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

但我找不到强制整数强制不变的用例.是否存在像String这样的技术原因?

  1. 字符串在网络连接,数据库URL等中用作参数.如果它是可变的,它很容易被破坏.
  2. 支持StringPool工具.
  3. 支持将字符串用作参数的类加载机制.字符串是可变的导致加载错误的类.

我知道有些包装就像AtomicInteger可变的一样.

更新:

从谈话中,没有普遍的理由可以强制整数是不可变的.然而,通过做不变,它提供了答案中提到的一些奖励.

比如安德烈的这句话

缓存的可能性.

其他人正在减少全球状态

更容易多线程

Dur*_*dal 21

您将找不到java.lang包装必须是不可变的强制性原因.仅仅因为这是一个设计决定.他们本来可以做出决定.语言设计者必须在可变不可变之间做出选择.他们选择了不变的.而已.

尽管有一些令人信服的(IMO)原因使它们变得不可变:

这符合String.你提供同样的道理String不变的适用Integer等,以及(如想在属性映射端口号).这通常适用于任何可变类型.

不可变类型排除了在通过修改通过getter获得的值不自觉地改变对象成员值时可以发现的过多难以发现的错误.当类型不可变时,它可以节省大量的防御性复制.最臭名昭着的例子是java.util.Date,这通常是一种痛苦,因为它是可变的(除了API问题).

同样不可变类型允许使用共享实例,例如Integer对常用值(参见Integer.valueOf(int)).

  • @Mani你错了,看看javadoc和/或来源. (5认同)
  • 我之所以选择不变的"理由"(我猜想)是詹姆斯·戈斯林想要避免可变类型的常见陷阱.决定产生的一切都是奖金/副作用. (2认同)

Sot*_*lis 5

价值的身份可以1改变吗?会变成2吗?不。这就是为什么Integer其他数字类型是不可变的。它们旨在为该身份建模。

  • 所以`1`是`int`,而不是`Integer`。Java设计人员可以在`Integer`中添加突变方法,这将非常可变。因此,我认为对“ Integer”为什么不可变的正确答案是,因为语言是按这种方式设计的。 (2认同)