您可以采取哪些步骤使具有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子类化。一种情况是通过方法传递的对象…在这种情况下,该对象是可变的,因为引用的值是实际传递的值。我同意使用接口隐藏对象的可变方面,只是调整了问题。