您可以采取哪些步骤使具有setter的java对象不可变?
你能做些什么使像这样的对象不可变?我最关心的是解决您可以采取哪些步骤使具有setter的java对象不可变?,java,final,Java,Final,你能做些什么使像这样的对象不可变?我最关心的是解决publicsvoidsomemethod(someobjectsomeobject){}你是对的,声明一个对象final并不会使它不可变。它所做的只是防止final变量被重新分配一个新对象,但是如果已经分配给它的对象的变异方法可用,那么它可能会变异 您可以为对象提供一个不可变的接口,并为该接口编程: interface ImmutableCar { String getMake(); String getModel(); } c
publicsvoidsomemethod(someobjectsomeobject){}
你是对的,声明一个对象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");
如果没有显式强制转换,您将无法访问变异方法。当然,这不会使对象真正不可变,因为强制转换仍然是一种可能性,但人们可能会争辩说,其他不可变对象可以通过反射进行更改,因此这种方法只允许您公开不可变的行为。您是对的,声明对象
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");
如果没有显式强制转换,您将无法访问变异方法。当然,这不会使对象真正不可变,因为强制转换仍然是一种可能性,但有人可能会认为,其他不可变对象可以通过反射进行更改,因此这种方法只允许您公开不可变的行为。仅在构造函数或成员声明中设置成员变量。构造函数返回后可以修改的任何对象都不是(也不可能是)真正的“不可变的”——对象不需要设置器。此外,听起来应该对的定义进行审查(它与“单一引用”无关)。那么某个对象将实现的接口上的最终声明呢。
final
有不同的含义,这取决于它的应用位置(它与应用于类时的不变性无关;也与以变量命名的对象的不变性无关)。我不知道“最终..在接口上”是什么意思(尽管可能是一个有趣的读物)。在您的示例中,final SomeObject SomeObject
引用变量SomeObject
是final,而不是它所指向的对象。IMO引用变量不能指向另一个对象,但可以修改对象。您是正确的@akhil\u mittal final仅允许在将成员变量设置为construct时设置引用tor或成员声明。构造函数返回后可以修改的任何对象都不是(也不可能是)真正的“不可变的”-对象不需要setter。而且,听起来应该检查的定义(它与“单引用”无关)。对于某个对象将实现的接口上的final声明如何。final
有不同的含义,这取决于它的应用位置(它与应用于类时的不变性无关;也与以变量命名的对象的不变性无关)。我不知道“final..on a interface”是什么意思(尽管读起来可能很有趣)。在您的示例中,final SomeObject SomeObject
引用变量SomeObject
是final,而不是它指向的对象。IMO引用变量不能指向另一个对象,但可以修改对象。您是正确的@akhil_mittal final只允许设置一次引用final ImmutableCar car=new car(“VW”,“宝来”;
将能够防止任何重铸……我们有一辆不变的汽车吗?@shinjw不是真的:一个人将能够编写((汽车)汽车)。setMake(“本田”)
即使car
被声明为final
。我明白你的意思,但这个问题对我来说似乎有点奇怪。我的意思是,可能是我,但为什么你要向一个类公开你希望不可变的对象?或者这个特定实例应该不可变?不管怎样,如果它允许ws子类化。一种情况是通过方法传递的对象……在这种情况下,该对象是可变的,因为引用的值是实际传递的值。我同意使用接口隐藏对象的可变方面。刚刚调整了这个问题。final ImmutableCar car=new car(“VW”,“Bora”);
将能够防止任何重铸……我们有一辆不变的汽车吗?@shinjw不太可能:一个人将能够编写((汽车)汽车).setMake(“本田”)
即使car
被声明为final
。我明白你的意思,但这个问题对我来说似乎有点奇怪。我的意思是,可能是我,但为什么你要向一个类公开你希望不可变的对象?或者这个特定实例应该不可变?不管怎样,如果它允许ws子类化。一种情况是通过方法传递的对象…在这种情况下,该对象是可变的,因为引用的值是实际传递的值。我同意使用接口隐藏对象的可变方面,只是调整了问题。