您可以采取哪些步骤使 java 对象具有 setter 不可变?

What steps can you make to make a java object with a setter to be immutable?

你能做些什么来使像这样的对象不可变?我最关心的是解决public void someMethod(SomeObject someObject) { } <== This case

例如:

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
}

你是对的,声明一个对象 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");

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