当前位置: 移动互联网学院 > Java培训 > JAVA开发 > 如何创建Java不可变类
如何创建Java不可变类 时间:2017-09-01     来源:华清远见JAVA学院

什么是Java不可变类呢?一般我们创建一个类的实例引用时,可以改变这个实例的内容。而Java不可变类指的是,当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。不可变类的实例一但创建,其内在成员变量的值就不能被修改。 今天华清Java学院小编就和大家一起学习一下Java不可变类

什么是不可变对象?

为了便于理解Java不可变类,这里介绍一下不可变对象。

一旦一个类的实例化对象被创建并初始化,那么它就不可以被改变。我们可以调用访问器方法(getter),复制对象,或者传递对象,但是不允许任何方法改变这个对象的状态。包装类(e.g.Integer或Float)和String类是不可变类的代表。

访问器方法(accessor method):对成员变量做出访问的方法,e.g.getter()方法。

修改器方法(mutator method):对成员变量做出修改的方法,e.g.setter()方法。

如何创建一个Java不可变类?

.所有成员都是private final

.不提供对成员的改变方法,例如:setXXXX 提供带参数的构造器,用于根据传入的参数来初始化属性。

.确保所有的方法不会被重载。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。

.如果某一个类成员不是原始变量(primitive)或者不可变类,必须通过在成员初始化(in)或者get方法(out)时通过深度clone方法,来确保类的不可变。

.如果有必要,重写hashCode和equals方法,同时应保证两个用equals方法判断为相等的对象,其hashCode也应相等。

示例:

public class Address {

private final String detail;

public Address() {

this.detail = "";

}

public Address(String detail) {

this.detail = detail;

}

public String getDetail() {

return detail;

}

@Override

public int hashCode() {

return detail.hashCode();

}

@Override

public boolean equals(Object obj) {

if (obj instanceof Address) {

Address address = (Address) obj;

if (this.getDetail().equals(address.getDetail())) {

return true;

}}

return false;

}}

X