要区分这两个概念,需要先弄明白 Java 是 Pass-by-Value(值传递)的。当 Java 在传递 primitive 变量的时候,是 copy value then pass value;当 Java 在传递引用型变量的时候,是 copy reference of value then pass the reference。

Immutable(不可变) Vs Mutable(可变)

  • Mutable Objects:即持有一个实例对象的引用时,引用指向的对象可以发生改变。
  • Immutable Objects:即持有一个实例对象的引用时,引用指向的对象不可以发生改变。

简而言之,Mutable 和 Immutable 的区别就是在对象的值发生改变的时候,对象会不会对新值生成一个新的引用,如果会,则是 Mmutable;否则则是 Immutable。

比如:

1
2
3
4
5
6
7
8
9
10
11
//Mutable
Point myPoint = new Point( 0, 0 );
System.out.println( myPoint );
myPoint.setLocation( 1.0, 0.0 );
System.out.println( myPoint );

//Immutable
String myString = new String( "old String" );
System.out.println( myString );
myString.replaceAll( "old", "new" );
System.out.println( myString );

result:

1
2
3
4
java.awt.Point[0.0, 0.0]
java.awt.Point[1.0, 0.0]
old String
old String

Unmodifiable(不可修改) Vs Modifiable(可修改)

  • Unmodifiable:即变量值不可以被修改
  • Modifiable:即变量值可以被修改

Immutable VS Modifiable

Immutable 和 Modifiable 讨论的是不同的内容:

  • Immutable:讨论的是变量的引用是否发生更改
  • Modifiable:讨论的是变量的值是否发生更改

Others

Template for Immutable Classes

  • Make all fields private
  • Don't provide mutators(不提供 setter)
  • Ensure that methods can't be overridden by either making the class final (Strong Immutability) or making your methods final (Weak Immutability)
  • If a field isn't primitive or immutable, make a deep clone on the way in and the way out.

参考