2011-01-11 16 views
78

Per favore, si dia la differenza tra oggetti mutevoli e oggetti immutabili con l'esempio.Differenza tra oggetti mobili e oggetti immutabili

+3

'classe STRING' è un esempio di un oggetto immutabile. – Qwerky

+0

Vedi anche [Oggetti mutabili vs immutabili] (http://stackoverflow.com/questions/214714/mutable-vs-immutable-objects) (non specifici di Java) –

+0

btw, dai un'occhiata a ['com.jcabi.aspects .Immutable'] (http://www.jcabi.com/jcabi-aspects/annotation-immutable.html) annotazione – yegor256

risposta

53

Gli oggetti mutabili possono avere i loro campi modificati dopo la costruzione. Gli oggetti immutabili non possono.

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 come hai risposto prima di @Ralph e più esplicitamente – KNU

19

Immutable Lo stato dell'oggetto non può essere modificato.

ad esempio 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

Gli oggetti mutabili hanno campi che possono essere modificati, gli oggetti immutabili non hanno campi che possono essere modificati dopo la creazione dell'oggetto.

Un oggetto immutabile molto semplice è un oggetto senza campo. (Ad esempio una semplice implementazione di Comparator).

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

Non sono diversi dal punto di vista di JVM. Gli oggetti immutabili non hanno metodi che possono modificare le variabili di istanza. E le variabili di istanza sono private; quindi non puoi cambiarlo dopo averlo creato. Un esempio famoso sarebbe String. Non hai metodi come setString o setCharAt. E s1 = s1 + "w" creerà una nuova stringa, con quella originale abbandonata. Questa è la mia comprensione.

+1

... e tutte le variabili di istanza sono private! (altrimenti -> mutabile) –

+0

@Andreas_D - Grazie per avermelo ricordato. Immagino di averlo preso per scontato. – LLS

+0

upvoted per "Non sono diversi dal punto di vista di JVM" – hammad

29

Gli oggetti immutabili sono semplicemente oggetti il ​​cui stato (i dati dell'oggetto) non può essere modificato dopo la costruzione. Esempi di oggetti immutabili da JDK includono String e Integer.

Ad esempio: (Point è mutevole e stringa immutabile)

 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); 

Il risultato è:

java.awt.Point[0.0, 0.0] 
java.awt.Point[1.0, 0.0] 
old String 
old String 
+0

Good 'ol Effective Java. – maffo

+0

Questo è quello che sto cercando ... THanks – HybrisFreelance

+0

myString.replaceAll ("vecchio", "nuovo"); - Questo codice deve essere come myString = myString.replaceAll ("vecchio", "nuovo"); - Penso che tu l'abbia usato nel modo sbagliato. – Tugrul

Problemi correlati