Scala

Scalaにおけるプライベートコンストラクタの定義方法について

More than 3 years have passed since last update.

シングルトンを表現する場合や自身のファクトリメソッド経由でのみ生成を強制させたい場合などの利用シーンにおいてコンストラクタを隠蔽するということがよく行われる。

Javaだと以下の様にコンストラクタにprivate宣言するだけだ。


java

private Foo(String name) {


Scalaの場合はコンパニオンオブジェクトがあるため、コンパニオン経由で生成をするようにしている場合もやはり直接のnewを防ぎたい。

しかしながら、Javaと同じように以下のようにしてしまうとコンパニオンからもアクセス出来なくなってしまうという困った問題がある。

private class Foo(name: String) {

以下の様に書けばパッケージプライベートになり、コンパニオンからアクセスできるようになるもののスコープが不必要に広がってしまう。

private[pkg] class Foo(name: String) {

スコープを不必要に広げることなく、自身とコンパニオンからだけアクセスできるようにする定義方法は以下のように記述する。

class Foo private (name: String) {