不给外部修改共享资源的机会,每次都返回一个新的对象。例如:String,Stream
Actor模型:https://en.wikipedia.org/wiki/Actor_model
public final class IntegerAccumulator{
private final int init;
public IntegerAccumulator(int init){
this.init = init;
}
//新的构造器,每次都返回一个新的对象
public IntegerAccumulator(IntegerAccumulator accumulator ,int init){
return new IntegerAccumulator(this,i);
}
public int getValue(){
return this.init;
}
}
此种方式共享资源不具有破坏性,但是需要使用final修饰,防止被子类破坏。但是单纯的只是final修饰并不具有不可变性。例如
public final class Immutable{
private final List<String> list;
public Immutable(List<String> list){
this.list = list;
}
//由于返回的是个集合对象,仍然给了修改对象的机会
public List<String> getList(){
return this.list
}
}
正确的方式:
public final class Immutable{
private final List<String> list;
public Immutable(List<String> list){
this.list = list;
}
//由于返回的是个集合对象,仍然给了修改对象的机会
public List<String> getList(){
return Collections.unmodifiableList(this.list);
}
}