home wiki.fukuchiharuki.me
Menu

#author("2022-09-17T06:33:14+00:00;2015-06-26T00:26:25+00:00","default:haruki","haruki")
#author("2022-09-17T06:52:15+00:00;2015-06-26T00:26:25+00:00","default:haruki","haruki")
* キーワード [#n9178e5b]
- 副作用(がない)
- Value Object

* 何か [#qf732305]

> 不変
 不変

インスタンスが作成されてから破棄されるまで、状態(属性)の変化をさせない。

* なぜか [#g3eea20f]

オブジェクトをイミュータブルにすると各方面がシンプルになる。オブジェクトの振舞い方がオブジェクトの中間状態によって左右されることがないので、振舞い方の定義は当然シンプルになる。また、オブジェクトを使用する側もそのことを期待できるで扱いがシンプルになる。さらに、状態の変化がないのでテストはずっとしやすくなる。

- シンプル
- スレッドセーフ
- テスタビリティ

* どのように [#o190f7a1]

完全コンストラクタによってインスタンス生成時点で完全の状態を作る。setterによる属性値の変更は当然させない。setterでなくても(オブジェクトの内部的な)副作用を伴うメソッドももたない。

たとえば「分数」というクラスを作成し次の計算式を実現したいとする。

 a = new 分数(1,2) // 1/2
 b = new 分数(1,3) // 1/3
 c = a + b

このとき、a と b のインスタンスは 1/2 と 1/3 の状態を保つ。+ メソッドは計算結果である 5/6 を新しいインスタンスとして返却するようにする。

* 関連 [#r03bf320]
- [[設計パターン/完全コンストラクタ]]

* 参考 [#n3b14d98]
- [[Scala_Exercise/Exercise_06.scala at master · fukuchiharuki/Scala_Exercise>https://github.com/fukuchiharuki/Scala_Exercise/blob/master/src/me/fukuchiharuki/scala_exercise/Exercise_06.scala]]