您可以采取哪些步骤使 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");
如果没有显式转换,您将无法访问变异方法。当然,这不会使对象真正不可变,因为转换仍然是一种可能性,但是有人可能会争辩说其他不可变对象可以通过反射来改变,所以这种方法让你只暴露不可变行为。
你能做些什么来使像这样的对象不可变?我最关心的是解决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");
如果没有显式转换,您将无法访问变异方法。当然,这不会使对象真正不可变,因为转换仍然是一种可能性,但是有人可能会争辩说其他不可变对象可以通过反射来改变,所以这种方法让你只暴露不可变行为。