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

Jot*_*thi 21 java wrapper

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

Jon*_*eet 22

任何没有给你任何改变其中数据的方法的类型都是不可变的 - 就这么简单.是的,所有原始包装类型都是不可变的1,原样String.UUID,URLURI其他示例.

虽然CalendarDate在内置的Java API是可变的,很多中类型的乔达时间是不变的-而在我看来,这是一个原因,约达时间是更容易使用.如果一个对象是不可变的,你可以在代码中的其他地方保留对它的引用,而不必担心其他一些代码是否会进行更改 - 更容易推理你的代码.


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;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,包装类本身没有任何不可变性 - 只是标准的设计是不可变的,因为它没有提供任何改变包装值的方法.

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

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
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个帖子已经在2年前被回答了,但我需要知道为了我的困惑.@JonSkeet为什么你说'整数a = 1000`和'整数b = 1000`a和b可以指同一个对象,但可能不是?在"整数x = 100"和"整数y = 100"时,x和y保证引用同一个对象? (4认同)
  • @GrahamGriffiths:价值观.请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7的最后几段 (2认同)

Fré*_*idi 11

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

然而,原子包装类 Java 5中(引入AtomicInteger,AtomicLong,AtomicBooleanAtomicReference<V>)是可变的.