所有原始包装类都是不可变对象吗?
Java 中的所有原始包装类都是不可变对象吗?字符串是不可变的。其他不可变对象是什么?
任何没有给你任何方法来更改其中数据的类型都是不可变的 - 就这么简单。是的,所有基元包装器类型都是不可变的1,就像 .UUID,URL和URI
是其他例子。String
尽管在内置的Java API中是可变的,但Joda Time中的许多类型都是不可变的 - 在我看来,这是Joda Time更容易使用的原因之一。如果一个对象是不可变的,你可以在代码中的其他地方保留对它的引用,而不必担心其他一段代码是否会进行更改 - 更容易推理你的代码。Calendar
Date
1 我的意思是等。如别处所指出的,这些类是可变的,而且确实必须具有可变性才能实现其目的。在我看来,“原始包装类的标准集合”和“包装原始值的类的集合”之间是有区别的。java.lang.Integer
Atomic*
您可以非常轻松地编写自己的可变包装类:
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