不可变性

本文深入探讨了不可变对象在技术领域的价值,并介绍了工厂方法和构建器模式解决对象初始化参数过多的问题。通过具体代码示例,展示了如何使用构建器模式创建不可变类实例,同时讨论了final引用的使用场景和不可变对象的局限性。

不可变对象的应用是非常有价值的技术。这些对象或许没有状态,或许只有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域的对象

不可变是非常强的技术,用处非常广泛。但是有时候只用不可变对象开发效率不行,因为每次修改对象状态就需要构建一个新对象。所以可变对象很有必要保留。

转载于:https://my.oschina.net/sudojs/blog/208690

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值