java之不可变对象1(immutable objects in java)
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