コンパニオンオブジェクトとは
Scalaでは、classキーワードにてクラスを定義し、objectキーワードによってシングルトンオブジェクトを定義するが、同じ名前のclassとobjectを、同じファイルに定義した場合、そのシングルトンオブジェクトは「コンパニオンオブジェクト」となる。
クラスとコンパニオンオブジェクトの関係
クラスとコンパニオンオブジェクトは、互いの非公開メンバーにアクセスできるという特権が与えられる。
コンパニオンオブジェクトの実例
コンパニオンオブジェクトはArrayクラスの以下のようなインスタンス化のコードで使われている。
val array = Array("one", "two")
このコードは、new キーワードによってインスタンスを作成することなく、Arrayのインスタンスを得ている。これは、Array.scala にて以下のようなコンパニオンオブジェクトが定義されているためである。
object Array { def apply[A <: AnyRef](xs: A*): Array[A] = { val array = new Array[A](xs.length) var i = 0 for (x <- xs.elements) { array(i) = x; i += 1 } array } } final class Array[A](_length: Int) extends Array.Array0[A] { }
Arrayコンパニオンオブジェクトのapplyメソッドとして、可変長の引数を取り、Arrayクラスをインスタンス化している。
[A <: AnyRef]は、引数がAnyRefのサブ型であることを指定 (xs: A*)は、引数xsがA型の可変長引数を取ることを指定