2011-01-11 84 views
78

任何人都可以通過示例給出可變對象和不可變對象之間的差異。可變對象和不可變對象之間的區別

+3

`String`類是不可變的對象的一個​​很好的例子。 – Qwerky 2011-01-11 14:10:44

+0

另請參見[可變與不可變對象](http://stackoverflow.com/questions/214714/mutable-vs-immutable-objects)(不是Java特定的) – 2011-01-11 14:15:01

+0

btw,看看[`com.jcabi.aspects .Immutable`](http://www.jcabi.com/jcabi-aspects/annotation-immutable.html)註釋 – yegor256 2013-02-18 07:06:00

回答

53

可變對象的構造後可以更改它們的字段。不可變對象不能。

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

19

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 
97

可變對象具有可以更改的字段,不可變對象沒有可以在對象創建後更改的字段。

一個非常簡單的不可變對象是一個沒有任何字段的對象。 (例如一個簡單的比較器實現)。

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 
} 
10

他們不是但從JVM的不同點。不可變對象沒有可以更改實例變量的方法。而實例變量是私有的;因此創建後無法對其進行更改。一個着名的例子是String。你沒有像setString或setCharAt這樣的方法。並且s1 = s1 +「w」將創建一個新的字符串,並放棄原來的字符串。 這是我的理解。

29

不可變對象只是對象的狀態(對象的數據)在構造後無法更改。來自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