しばしば不変性と可変性という言葉に出会います.オブジェクトが内部状態を変えない不変オブジェクトは,同期が不要,テストが容易であるなどのメリットが示されていました.設計としても,不変オブジェクトならば,メソッドが最小単位で仕事を行いやすいですね.
しかしながら,実世界に存在するものは,様々な状態に変化します.例えばサイコロは出目という状態を持ち,人に投げられることで,その状態が変化します.JavaのBigIntegerのように,演算結果を新しいインスタンスによって返すような不変オブジェクト設計をサイコロに適用すると,サイコロが転がって新しいサイコロを作るのか?と納得がいきません.今あるものの状態が変化すべきという点で,可変オブジェクトは納得がいきます.不変オブジェクト,可変オブジェクト,どちらが適切に実世界を切り取っていると考えますか.
みなさまの様々なご意見いただければと思います.よろしくお願いします.
java
1final class NonStateDice { 2 private final Random random = SecureRandom.getInstanceStrong(); 3 int roll() { 4 return random.nextInt(6) + 1; 5 } 6} 7 8final class MutableDice { 9 private final Random random = SecureRandom.getInstanceStrong(); 10 private int roll; 11 void roll() { 12 roll = random.nextInt(6) + 1; 13 } 14 int show() { 15 return roll; 16 } 17} 18final class ImmutableDice { 19 private final Random random = SecureRandom.getInstanceStrong(); 20 private final int roll; 21 22 ImmutableDice(final int roll) { 23 this.roll = roll; 24 } 25 ImmutableDice roll() { 26 return new ImmutableDice(random.nextInt(6) + 1); 27 } 28 int show() { 29 return roll; 30 } 31}
議論したいのは、オブジェクトが状態を持つか否か、ではなく、オブジェクトが持っている状態が変化するか否か、のように思いますが違いますか。ちょっと混同されているように見えますが。
おっしゃる通りでした.修正いたします.オブジェクトは一般的に状態を持ち,その上で不変性の議論ですね.
回答6件
あなたの回答
tips
プレビュー