2011-01-11 2 views
78

변경 가능한 개체와 변경할 수없는 개체 사이의 차이점을 알려주십시오.가변 개체와 변경 불가능 개체의 차이점

+3

'String' 클래스는 불변 오브젝트의 좋은 예이다. – Qwerky

+0

도 참조하십시오. [변경 가능 개체와 불변 개체] (http://stackoverflow.com/questions/214714/mutable-vs-immutable-objects) –

+0

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

답변

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

@Ralph 이전에 대답 한대로 +1로 명시 적으로 – KNU

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

변경 가능 개체는 변경할 수 있으며 변경 불가능 개체는 개체 생성 후 변경할 수있는 필드가 없습니다.

매우 간단한 불변 개체는 필드가없는 개체입니다. (예를 들어 간단한 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

이들은 JVM의 관점과 다르지 않습니다. 변경할 수없는 객체에는 인스턴스 변수를 변경할 수있는 메소드가 없습니다. 그리고 인스턴스 변수는 private입니다. 그러므로 그것을 만든 후에는 변경할 수 없습니다. 유명한 예가 String입니다. 당신은 setString이나 setCharAt와 같은 메소드를 가지고 있지 않다. 그리고 s1 = s1 + "w"는 원래 문자열을 버린 새 문자열을 만듭니다. 그건 내 이해입니다.

+1

... 모든 인스턴스 변수는 private입니다! (그렇지 않으면 -> 변경 가능) –

+0

@Andreas_D - 상기시켜 주셔서 감사합니다. 나는 그것을 당연한 것으로 생각한다. – LLS

+0

upvoted "그들은 JVM의 관점에서 다르지 않다" – hammad

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 
+0

좋은 'ol 효과적인 자바. – maffo

+0

이것은 내가 찾고있는 것입니다 ... 감사합니다. – HybrisFreelance

+0

myString.replaceAll ("old", "new"); 이 코드는 다음과 같아야합니다. myString = myString.replaceAll ("old", "new"); - 네가 잘못 사용한 것 같아. – Tugrul

관련 문제