15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-17

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

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) {
15
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?