可变对象和不可变对象之间的区别
答
可变对象的构造后可以更改它们的字段。不可变对象不能。
public class MutableClass {
private int value;
public MutableClass(int aValue) {
value = aValue;
}
public void setValue(int aValue) {
value = aValue;
}
public getValue() {
return value;
}
}
public class ImmutableClass {
private final int value;
// changed the constructor to say Immutable instead of mutable
public ImmutableClass (final int aValue) {
//The value is set. Now, and forever.
value = aValue;
}
public final getValue() {
return value;
}
}
+2
+1,因为您在@Ralph之前回答,更明确地说 – KNU 2014-10-02 16:44:54
答
Immutable对象的状态不能改变。
例如String
。
String str= "abc";//a object of string is created
str = str + "def";// a new object of string is created and assigned to str
答
可变对象具有可以更改的字段,不可变对象没有可以在对象创建后更改的字段。
一个非常简单的不可变对象是一个没有任何字段的对象。 (例如一个简单的比较器实现)。
class Mutable{
private int value;
public Mutable(int value) {
this.value = value;
}
//getter and setter for value
}
class Immutable {
private final int value;
public Immutable(int value) {
this.value = value;
}
//only getter
}
答
他们不是但从JVM的不同点。不可变对象没有可以更改实例变量的方法。而实例变量是私有的;因此创建后无法对其进行更改。一个着名的例子是String。你没有像setString或setCharAt这样的方法。并且s1 = s1 +“w”将创建一个新的字符串,并放弃原来的字符串。 这是我的理解。
答
不可变对象只是对象的状态(对象的数据)在构造后无法更改。来自JDK的不可变对象的示例包括String和Integer。
例如:(点是可变的和不可变的字符串)
Point myPoint = new Point(0, 0);
System.out.println(myPoint);
myPoint.setLocation(1.0, 0.0);
System.out.println(myPoint);
String myString = new String("old String");
System.out.println(myString);
myString.replaceAll("old", "new");
System.out.println(myString);
的输出是:
java.awt.Point[0.0, 0.0]
java.awt.Point[1.0, 0.0]
old String
old String
`String`类是不可变的对象的一个很好的例子。 – Qwerky 2011-01-11 14:10:44
另请参见[可变与不可变对象](http://stackoverflow.com/questions/214714/mutable-vs-immutable-objects)(不是Java特定的) – 2011-01-11 14:15:01
btw,看看[`com.jcabi.aspects .Immutable`](http://www.jcabi.com/jcabi-aspects/annotation-immutable.html)注释 – yegor256 2013-02-18 07:06:00