你可以做些什么来制作一个像这样不可变的对象?我主要关注解决public void someMethod(SomeObject someObject) { }
< ==此案例
例如:
public class SomeObject {
private String someString;
public void setSomeString(String someString) {
this.someString = someString;
}
public void getSomeString() {
return someString;
}
}
public void someMethod() {
final SomeObject someObject = new SomeObject();
someObject.set("Want to prevent this"); // <-- SomeObject is mutable in this case
}
public void someMethod(SomeObject someObject) {
someObject.set("And prevent this!"); // <-- And so is this
}
答案 0 :(得分:4)
你是对的,声明一个对象final
并不会使它不可变。它所做的只是阻止final
变量重新分配一个新对象,但是如果其变异方法可用,则已经分配给它的对象可能会被变异。
您可以为对象提供一个不可变的接口,并编程到该接口:
interface ImmutableCar {
String getMake();
String getModel();
}
class Car implements ImmutableCar {
public Car(String make, String model) {
this.make = make;
this.model = model;
}
private String make;
private String model;
public String getMake() { return make; }
public void setMake(String m) { make = m; }
public String getModel() { return model; }
public void setModel(String m) { model = m; }
}
如果你这样做
ImmutableCar car = new Car("VW", "Bora");
如果没有显式强制转换,您将无法访问变异方法。当然这不会使对象真正不可变,因为转换仍然是可能的,但是人们可以争辩说其他不可变对象可以通过反射来改变,所以这种方法只允许你暴露不可变行为。