对象是不可变的吗?

时间:2016-12-18 17:49:58

标签: java object

我必须决定以下两个对象是否是不可变的。我查找定义说:“如果一个对象的状态在构造之后无法改变,则该对象被视为不可变。”

public class Car {
    private int spareTires = 1;
    private String model = "Volkswagen";
    private Person driver = new Person();
    public double engineSize = 2.0;
    public int getSpareTires() { return spareTires; }
    public String getModel() { return model; }
    public Person getDriver() { return driver; }
}

public class Person {
    private String name = "James";
    public void setName(String s) { name = s; }
    public String getName() { return name; }
}

Person不可变,因为它有一个mutator方法(setName())。

但是,我对Car不确定。 Car没有任何mutator方法,但根据https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html,必须将字段声明为final和static,但并非如此。另外我相信可以通过public double engineSize = 2.0;改变状态吗?

2 个答案:

答案 0 :(得分:0)

  

然而,我不确定汽车。汽车没有任何改变方法   但根据   https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html   这些字段必须声明为final和static,但事实并非如此。

不一定是静态的,最终就足够了。

  

此外,我相信通过“公开”改变国家是可能的   double engineSize = 2.0; “?

实际上,要成为不可变的,您不必公开公开描述实例状态的字段。否则,实例的任何客户端类都可能会更改engineSize

此外,Car类中的此getter使Person可修改,因为Person不是不可变的:

   public Person getDriver() { return driver; }

答案 1 :(得分:0)

Car不是不可变的,因为它具有可变的driver属性并公开了可变的公共engineSize方法。这两个课程都不是最终的。