同じファイル内において、クラスと同じ名前で定義されたシングルトンオブジェクトをコンパニオンオブジェクトと呼ぶ。コンパニオンオブジェクトは対応するクラスに対して特権的なアクセス権を持っていて、private なフィールドに対してもアクセスできる。
試してみよう。なお、REPL で試すには :paste コマンドを使って、ペーストモードになってからクラスとコンパニオンオブジェクトを一緒に定義する。こうしないと、REPL が正しく認識できないらしい。先のエントリーで警告が出てたのはこのせいだな。
scala> :paste // Entering paste mode (ctrl-D to finish) class Person(val name: String, var age: Int, private var weight: Int) object Person { def printWeight(): Unit = { val andy = new Person("Andy", 27, 65) println(andy.weight) } } // Exiting paste mode, now interpreting. defined class Person defined object Person
ペーストモードを抜けるには Ctrl-D。
で、上のように定義したのがクラス Person とそのコンパニオンオブジェクト Person だ。コンパニオンオブジェクトの中から、プライベートは weight フィールドにアクセスしている。
じゃあ試してみよう。
scala> Person.printWeight 65
この通り、weight の値が出力された。