什么是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;
}}
热点新闻