[scala][java][tutorial] Scala本を読む 5

宿題やってる気分

6章は「関数形スタイルのオブジェクト」(の作り方)
変化する状態を持たない=イミュータブル

  • 6.2

クラス定義

class Rational(n:Int, d:Int){
  println("created.")
}

クラス定義の後ろの()内は"基本コンストラクター"
よくある、初期値を引数にとってクラス内のメンバを初期化するようなコードを簡略に書ける。
そもそもn,dはセットする必要もなく、後でクラス内で利用可能。private変数扱い

コラム:イミュータブルのメリット・デメリット

    1. ○状態変化しないので動作が推定しやすい
    2. ○オブジェクトを他のコードに渡すとき、コピーを作る必要がない
    3. ○スレッドセーフ
    4. ○ハッシュテーブルで後から変更が加えられる恐れがない
    5. ×大きなオブジェクトのコピーが必要になることがある
  • 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.

基本コンストラクター以外のコンストラクター
補助〜は、最初にそのクラスの他のコンストラクターを呼び出すことが必要。
Javaのコンストラクタではスーパークラスのコンストラクタも許可されているが、Scalaはダメ。

  • 6.8 非公開フィールドとメソッド

private。
scalaのコンストラクタ内の処理は記述順に実行される

+や*は通常のメソッド定義と同じように書ける。演算子の優先順位も*>+

  • 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クラスに型変換された
→把握していないとあとで勝手に型変換されそう。