不可变类
Java 不可变类指的是,该类变量一旦被初始化就无法改变的类。
不可变类的优点:
- 线程安全(因为不可变)
- 效率更高 (多线程无需加锁)
- 可以被重复使用,而不担心出错。比方说那一个静态变量存储该实例的hash值。
Immutalbe类的使用注意事项
不可变意味着失去灵活性,如果大量使用不可变类实例,变量得不到复用的话,会造成内存泄露。
Immutable类的编写原则
- 类设置为final对象,避免被继承。假设A类不可变类,而是不要final,B类继承A类。 那么A a = new B(), 然后客户程序员认为A是不可变类,这会造成较大误解。
- 所有成员变量都设置为final对象。
- 避免有成员函数返回成员变量的引用,外部程序会通过这种方式修改引用所指向的值。
- 返回变量时候尽量返回变量的拷贝。
下面为简单的不可变类,注意返回user的时候必须返回拷贝,而不是User本身。
public final class MainClass
{
private final String document ;
private final User user;
public MainClass(String doc,int age,String name)
{
document = doc;
user = new User(age,name);
}
// 必须返回clone 新对象
public User getUser()
{
//return user;
return (User)(this.user.clone());
}
public void printUser()
{
System.out.println(this.document+":"+this.user.getName());
}
public static void main(String args[])
{
MainClass inst = new MainClass("a good guy",19,"allen");
inst.printUser();
User u = inst.getUser();
u.setName("jack");
inst.printUser();
}
}
class User implements Cloneable
{
private int age;
private String name;
public User(int age,String name)
{
this.age= age;
this.name =name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User clone()
{
return new User(this.age,this.name);
}
}