我必须决定以下两个对象是否是不可变的。我查找定义说:“如果一个对象的状态在构造之后无法改变,则该对象被视为不可变。”
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;
改变状态吗?
答案 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
方法。这两个课程都不是最终的。