不可变对象的应用是非常有价值的技术。这些对象或许没有状态,或许只有final域(因此只能在构造方法中赋值)。他们总是安全而又活跃的。他们的状态不能修改,所以不可能表现出不一致的情况
但是这样对象初始化的时候所有值都要传入构造方法,这样会造成构造方法的参数很多,看起来很二。因此很多人采用了工厂方法
工厂方法:就是一个类中的静态方法,用来代替构造方法创建新对象。此时的构造方法通常声明为protected或者是private,从而使工厂方法称为实例化对象的唯一方法。
构建器模式:
1:解决问题:当工厂方法参数传入过多,尤其当初始化对象所需的参数有多个不同来源时。
2:组成部分:一个是实现了构建器泛型接口的静态内部类。另一个是构建不可变类实例的私有构造方法。
内部静态类实不可变类的构建器,开发人员只能通过它获得不可变类的新实例。较为常见的实现方式:让构建器拥有与不可变类一模一样的域,但构建器的域是可修改的。
<!-- lang: java -->
//构建器接口
interface ObjBuilder<T> { T build(); }
public class Update { // 必须在构造方法中初始化final域 private final Author author; private final String updateText;
private Update(Builder b_) {
author = b_.auhtor;
updateText = b_.updateText;
}
// 构造器类必须是静态内部类
public static class Builder implements ObjBuilder<Update> {
private Author author;
private String updateText;
// 可用在调用链中返回Builder的方法
public Builder author(Author author_) {
author = author_;
return this;
}
// 可用在调用链中返回Builder的方法
public Builder author(String updateText_) {
updateText = updateText_;
return this;
}
@Override
public Update build() {
return new Updata(this);
}
// 略去hashCode()和equals()方法
}
} 有了这段代码,可以创建新的Update对象: Update.Builder ub = new Update.Builder(); Update u = ub.author(myAuthor).update("Hello").build();
这是一个广泛通用的模式
最后一点:关键字final仅对其直接指向的对象有用,也就是说final引用可以指向带有非final域的对象
不可变是非常强的技术,用处非常广泛。但是有时候只用不可变对象开发效率不行,因为每次修改对象状态就需要构建一个新对象。所以可变对象很有必要保留。