2011-01-11 25 views
78

Por favor, cualquiera dé la diferencia entre objetos mutables y objetos inmutables con el ejemplo.Diferencia entre objetos mutables e inmutables

+3

clase 'string' es un gran ejemplo de un objeto inmutable. – Qwerky

+0

Ver también [Objetos mutables frente a objetos inmutables] (http://stackoverflow.com/questions/214714/mutable-vs-immutable-objects) (no específicos de Java) –

+0

Por cierto, eche un vistazo a ['com.jcabi.aspects .Immutable'] (http://www.jcabi.com/jcabi-aspects/annotation-immutable.html) anotación – yegor256

Respuesta

53

Los objetos mutables pueden tener sus campos cambiados después de la construcción. Los objetos inmutables no pueden.

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 como respondiste antes @Ralph y más explícitamente – KNU

19

Immutable El estado del objeto no se puede modificar.

por ejemplo 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

objetos mutables tienen campos que se pueden cambiar, objetos inmutables no tienen campos que se pueden cambiar después de crear el objeto.

Un objeto inmutable muy simple es un objeto sin ningún campo. (Por ejemplo, una implementación simple de Comparador).

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

No son diferentes desde el punto de vista de JVM. Los objetos inmutables no tienen métodos que puedan cambiar las variables de instancia. Y las variables de instancia son privadas; por lo tanto, no puede cambiarlo después de crearlo. Un ejemplo famoso sería String. No tiene métodos como setString o setCharAt. Y s1 = s1 + "w" creará una nueva cadena, con la original abandonada. Eso es lo que entiendo.

+1

... ¡y todas las variables de instancia son privadas! (de lo contrario -> mutable) –

+0

@Andreas_D - Gracias por recordarnos. Supongo que lo tomé como concedido. – LLS

+0

upvoted para "No son diferentes desde el punto de vista de JVM" – hammad

29

Los objetos inmutables son simplemente objetos cuyo estado (los datos del objeto) no pueden cambiar después de la construcción. Los ejemplos de objetos inmutables del JDK incluyen String e Integer.

Por ejemplo: (Point es mutable y cadena inmutable)

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

La salida es:

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

Buena versión de Java efectiva. – maffo

+0

Esto es lo que estoy buscando ... THanks – HybrisFreelance

+0

myString.replaceAll ("viejo", "nuevo"); - Este código debe ser así myString = myString.replaceAll ("viejo", "nuevo"); - Creo que lo has usado de manera incorrecta. – Tugrul

Cuestiones relacionadas