您可以使用哪些步骤来使具有setter的java对象成为不可变的?

时间:2015-05-12 01:41:47

标签: java final

你可以做些什么来制作一个像这样不可变的对象?我主要关注解决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
}

1 个答案:

答案 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");

如果没有显式强制转换,您将无法访问变异方法。当然这不会使对象真正不可变,因为转换仍然是可能的,但是人们可以争辩说其他不可变对象可以通过反射来改变,所以这种方法只允许你暴露不可变行为。