为什么Float和Double包装器类在Java中是不可变的?

时间:2019-01-25 05:26:31

标签: java wrapper immutability

Byte,Short和Integer维护代表-128到127的缓冲池值。代表'\ u0000'到'\ u007F'的字符池值。

这样我就能理解为什么所有上述包装器类都是不可变的。

但是,Float和Double不会维护任何缓冲池,那么将这些类设置为不可变的目的是什么?

我从下面的链接中阅读:
https://coderanch.com/t/670745/java/Wrapper-Classes-Immutable

2 个答案:

答案 0 :(得分:0)

首先,如果ByteShortCharacterInteger是不可变的,那么将Double和{{1 }}可变。

可变性也有代价-您不能在多个线程之间安全地共享同一资源。按需复制它们非常便宜。

我也没有看到使它们可变的用例-如果您想将其用作一些组合的输入/输出参数,那是一个糟糕的设计。

答案 1 :(得分:0)

如果标准的原始包装器是可变的,那么您将有效地破坏装箱/拆箱功能。

 Integer mutable = 1;
 mutable.setValue(2);
 Integer one = 1;
 System.out.println(one);   // Prints '1'?  Or '2'?

如果您想要可变的原始包装器,则它们或多或少已经以Java SE“原子”类的形式存在;即AtomicBooleanAtomicIntegerAtomicLong。这些具有线程安全的优点(但也有成本)。

其他替代方法包括一个元素数组,使用第三方方法,例如Apache Commons MutableInt(等)类,或者一次以大约10行代码编写自己的类。

另请参阅: