所有原始包装类都是不可变对象吗?

2022-09-02 03:19:36

Java 中的所有原始包装类都是不可变对象吗?字符串是不可变的。其他不可变对象是什么?


答案 1

任何没有给你任何方法来更改其中数据的类型都是不可变的 - 就这么简单。是的,所有基元包装器类型都是不可变的1,就像 .UUIDURLURI是其他例子。String

尽管在内置的Java API中是可变的,但Joda Time中的许多类型都是不可变的 - 在我看来,这是Joda Time更容易使用的原因之一。如果一个对象是不可变的,你可以在代码中的其他地方保留对它的引用,而不必担心其他一段代码是否会进行更改 - 更容易推理你的代码。CalendarDate


1 我的意思是等。如别处所指出的,这些类是可变的,而且确实必须具有可变性才能实现其目的。在我看来,“原始包装类的标准集合”和“包装原始值的类的集合”之间是有区别的。java.lang.IntegerAtomic*

您可以非常轻松地编写自己的可变包装类:

public class MutableInteger
{
    private int value;

    public MutableInteger(int value) 
    {
         this.value = value;
    }

    public int getValue()
    {
        return value;
    }

    public void setValue(int value)
    {
        this.value = value;
    }
}

因此,正如您所看到的,包装器类本身并没有什么不可变的 - 只是标准类被设计为不可变的,因为它没有提供任何方法来更改包装值。

请注意,这允许在装箱时重复使用相同的对象,对于公共值:

Integer x = 100;
Integer y = 100;
// x and y are actually guaranteed to refer to the same object

Integer a = 1000;
Integer b = 1000;
// a and b *could* refer to the same object, but probably won't

答案 2

在Java 5之前,所有原始包装类都是不可变的。

但是,Java 5(、和)中引入的原子包装类是可变的。AtomicIntegerAtomicLongAtomicBooleanAtomicReference<V>


推荐