[scala][java][tutorial] Scala本を読む 5
宿題やってる気分
6章は「関数形スタイルのオブジェクト」(の作り方)
変化する状態を持たない=イミュータブル
- 6.2
クラス定義
class Rational(n:Int, d:Int){ println("created.") }
クラス定義の後ろの()内は"基本コンストラクター"
よくある、初期値を引数にとってクラス内のメンバを初期化するようなコードを簡略に書ける。
そもそもn,dはセットする必要もなく、後でクラス内で利用可能。private変数扱い
コラム:イミュータブルのメリット・デメリット
-
- ○状態変化しないので動作が推定しやすい
- ○オブジェクトを他のコードに渡すとき、コピーを作る必要がない
- ○スレッドセーフ
- ○ハッシュテーブルで後から変更が加えられる恐れがない
- ×大きなオブジェクトのコピーが必要になることがある
- 6.3 toStringメソッドのオーバーライド
class Rational(n:Int, d:Int){ override def toString = n + "/" + d }
- 6.4 事前条件のチェック
class Rational(n:Int, d:Int){ require (d != 0) override def toString = n + "/" + d }
requireメソッドは引数がfalseのときにIllegalArgumentExceptionを投げる
- 6.5
略
- 6.6 自己参照
this.
- 6.7 補助コンストラクター
基本コンストラクター以外のコンストラクター
補助〜は、最初にそのクラスの他のコンストラクターを呼び出すことが必要。
Javaのコンストラクタではスーパークラスのコンストラクタも許可されているが、Scalaはダメ。
- 6.8 非公開フィールドとメソッド
private。
scalaのコンストラクタ内の処理は記述順に実行される
- 6.9 演算子の定義
+や*は通常のメソッド定義と同じように書ける。演算子の優先順位も*>+
- 6.10 識別子
1. 演算子識別子
英数字とコードの記述に必要な(かっこ、ピリオド、_、カンマなど)以外の7ビットASCII文字
+ とか、++とか、:->とか。スペースを入れずにひと塊りにできる。
Javaの世界は、+は$plus、:は$colonのように変換されてメソッド名になっているので、
メソッド"+"はa.$plus(b)のように呼べる
2. ミックス識別子
英数字+アンダースコア+演算子識別子からなる
3. リテラル識別子
バッククォートで囲まれた名前。Javaの世界にあるScalaの予約後でできたメソッドにアクセスするために使う。
javaのThread.yield()が主な使いどころらしい。
Thread.`yield`()とアクセス。
- 6.11 メソッドの多重定義
javaと同じ
- 6.12 暗黙の型変換
implicit def intToRational(x:Int) = new Rational(x)
implicitで、コンパイラに”さまざまな状況で自動的に適用”するよう指定する。
2 * new Rational(1,2)はできなかったが、これで
val r = new Rationla(1,2) 2 * r
ができるようになる。
整数2に対してRationalクラスの*メソッドが無いためエラーになっていたが、
implicitで整数2をRationalクラスに型変換された
→把握していないとあとで勝手に型変換されそう。