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

2022-09-04 06:15:06

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

在问这个问题之前,我浏览了其他答案:

整数不可变

i++ 仍然在 Java 中为不可变整数工作?

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

但是我找不到要求整数不可变的用例。是否有任何像String这样的技术原因?

  1. 字符串用作网络连接、数据库 URL 等中的参数。如果它是可变的,它很容易受到损害。
  2. 支持字符串池工具。
  3. 支持将字符串用作参数的类装入机制。字符串可变会导致加载错误的类。

我知道有像可变的包装器。AtomicInteger

更新:

从对话中可以看出,没有普遍的理由可以强制整数是不可变的。但是,通过执行不可变操作,它提供了答案中提到的一些奖励。

比如安德烈的这句话

可以缓存。

其他人正在减少全局状态

更易于多线程处理


答案 1

你不会找到一个强制性的理由来解释为什么包装器必须是不可变的。仅仅因为这是一个设计决策。他们本来可以做出其他决定。语言设计人员必须在可变和不可变之间进行选择。他们选择了不可变的。就是这样。java.lang

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

它与 一致。您提供的不可变的相同推理也适用于等(例如,考虑属性映射中的端口号)。这通常适用于任何可变类型StringStringInteger

不可变类型排除了大量难以发现的错误,在这些错误中,人们通过修改通过 getter 获得的值不由自主地更改了对象成员值。当类型不可变时,它节省了大量的防御性复制。最臭名昭著的例子是 ,这通常是一个痛苦的使用,因为它是可变的(撇开API问题不谈)。java.util.Date

不可变类型还允许使用共享实例,例如 对常用值执行 (请参见)。IntegerInteger.valueOf(int)


答案 2

值的身份会改变吗?它能成为吗?哈哈这就是为什么和其他数值类型是不可变的。它们旨在模拟这种身份。12Integer