an immutable object is an object whose state cannot be modified after it is created.
不可变对象一旦被创建就它的状态就不能被修改。
A classic example of an immutable object is an instance of the Java String
class.
不可变对象的一个经典的例子是String类的实例。
String s = "ABC";
s.toLowerCase();
The method toLowerCase()
will not change the data "ABC" that s
contains.
Instead, a new String object is instantiated(被实例化 ) and given the data "abc" during its construction.
A reference to this String object is returned by the toLowerCase()
method.
To make the String s
contain the data "abc", a different approach is needed.
s = s.toLowerCase();
Now the String s
references a new String object that contains "abc". The String class's methods never affect the data that a String object contains.
For an object to be immutable, there has to be no way to change fields, mutable or not, and to access fields that are mutable.
Here is an example of a mutable object.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
class Cart {
private final List items;
public Cart(List items) {
this.items = items;
}
public List getItems() {
return items;
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("element1");
Cart cart = new Cart(list);
cart.getItems().add("element2");
// 下面的代码能运行吗?为什么
// list=new LinkedList();
// cart.items=list;
}
}
An instance of this class is not immutable: one can add or remove items either by obtaining the field items
by calling getItems()
or by retaining(保留,保持 ) a reference to the List object passed when an object of this class is created.
The following change partially solves this problem. In the ImmutableCart
class, the list is immutable: you cannot add or remove items.
However, there is no guarantee that the items are also immutable.
One solution is to use the decorator pattern as a wrapper around each of the list's items to make them also immutable.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class ImmutableCart {
private final List items;
public ImmutableCart(List items) {
this.items = Collections.unmodifiableList(new ArrayList(items));
}
public List getItems() {
return items;
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("element1");
ImmutableCart cart = new ImmutableCart(list);
cart.getItems().add("element2");
}
}
运行抛出异常:
Exception in thread "main" java.lang.UnsupportedOperationException