kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

ひょっとしたら役に立つかもしれないScala Tips(1) - プライマリコンストラクタ引数の隠蔽 -

先週金曜日のScala勉強会@豆蔵で、case classに関して、通常は公開されることを意識してつけないコンストラクタの仮引数名が公開されることになっちゃうので、慎重に名前を決めないといけないよねー、という感じのことをNyaRuRuさんがおっしゃってたのですが、ちょうどそのとき、こうすれば良いのではないかなーと思いついた方法をScalaの対話環境に入力して試してみたらOKだったので、Tipsとして紹介しておきます。

方法は至極単純で、プライマリコンストラクタの引数にprivateを付けるだけ。これで、case class(に限らないですが)のコンストラクタ引数は非公開になり、パターンマッチを経由してのみ値を取り出すことが可能になるので、テキトーな名前をつけても良くなります。

scala> case class Point(private val x: Int, private val y: Int)
defined class Point

scala> val p = Point(3, 4)
p: Point = Point(3,4)

scala> p.x
<console>:8: error: value x cannot be accessed in Point
p.x
^

scala> p.y
<console>:8: error: value y cannot be accessed in Point
p.y
^

scala> val Point(a, b) = p
a: Int = 3
b: Int = 4

ちなみに、この内容のほとんどは、既にLingrのscala-jaルームで書いたことをそのまま貼り付けただけです。