web-dev-qa-db-ja.com

可変オブジェクトと不変オブジェクトの違い

例を挙げて、MutableオブジェクトとImmutableオブジェクトの差分を教えてください。

99
Rams

可変オブジェクトには変更可能なフィールドがあり、不変オブジェクトにはオブジェクトの作成後に変更できるフィールドがありません。

非常に単純な不変オブジェクトは、フィールドのないオブジェクトです。 (たとえば、単純なコンパレータ実装)。

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
}
125
Ralph

可変オブジェクトは、構築後にフィールドを変更できます。不変オブジェクトはできません。

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

}
67
Mike

不変オブジェクトとは、作成後に状態(オブジェクトのデータ)を変更できないオブジェクトです。 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
31
user536158

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
22
Jigar Joshi

これらは、JVMの観点と違いはありません。不変オブジェクトには、インスタンス変数を変更できるメソッドがありません。また、インスタンス変数はプライベートです。したがって、作成後に変更することはできません。有名な例は文字列です。 setStringやsetCharAtのようなメソッドはありません。そして、s1 = s1 + "w"は新しい文字列を作成し、元の文字列は破棄されます。それが私の理解です。

12
LLS