Scalaのプライベートおよび保護されたコンストラクター


109

私は、Scalaに明示的なプライマリコンストラクターがないことの影響について興味を持っていました。クラス本体のコンテンツだけです。

特に、プライベートまたは保護されたコンストラクターパターン、つまり、コンパニオンオブジェクトまたは別のクラスまたはオブジェクトのメソッドを介して構築を制御することは、明確な実装を持たないのではないかと思います。

私が間違っている?もしそうなら、それはどのように行われますか?


Scalaシングルトンを(objectキーワードを使用して)作成し、そのシングルトン内でクラスをプライベートとして定義し、オブジェクトを構築するためのシングルトンのメソッドを作成できます。
Paggas、2009年

@Paggas、残念ながら、スコープ外でプライベートとマークされたクラスのインスタンスを返すと、スコープコンパニオンオブジェクトのメソッドから返された場合でも、コンパイルされません。
ドンマッケンジー

これは、Scalazソースコード全体でかなり大量に行われます。この概念は、抽象代数データ型とも呼ばれます。
Tony Morris、

回答:


190

次のように、クラス名とパラメーターリストの間に適切なキーワードを挿入することで、デフォルトのコンストラクターをプライベート/保護として宣言できます。

class Foo private () { 
  /* class body goes here... */
}

Aleksanderに感謝します。これがScalaの本の1つで示されているのか、それとも言語仕様で示されているのか教えていただけますか?申し訳ありませんが、まだ投票できません。
ドンマッケンジー

「プログラミングScala」のコンストラクターの説明(92〜95ページ)を一見しただけで、そこに言及されていません。私は実際に古い変更ログであなたの質問に対する答えを見つけましたが、それが他のどこかで言及されたことは今まで見たことがありません。リンク:scala-lang.org/node/43#2.4.0
Aleksander Kmetec 2009年

18
「Scalaでのプログラミング」のPag 414。WamplerのプログラミングScalaの97ページ。SubramaniamのプログラミングScalaの60ページ。現在、Beginning ScalaのPDFを持っていないので、確認することはできません。
ダニエルC.ソブラル

ああ、私は今それを97ページで見ています。ありがとう。
Aleksander Kmetec 2009年

1
両方のさらなる研究に感謝し、私はWamplerの本を手に入れましたが、私の携帯電話でしか読めなかったのは明らかですが、Oderskyの本を驚くほどよく補完していることがわかりました。
ドンマッケンジー

64

Aleksanderの答えは正しいですが、Scalaでのプログラミングは追加の代替手段を提供します:

sealed trait Foo {
 // interface
}

object Foo {
  def apply(...): Foo = // public constructor

  private class FooImpl(...) extends Foo { ... } // real class
}

18
数年後には次のように言っています:これは質問に対する良い答えですが、問題に対する悪い解決策だと思います。将来のプログラマーがアレクサンダーのコードを使用する場合、彼は「ああ、プライマリコンストラクターはプライベートですが、他のコンストラクターはプライベートではない」と言います。そのプログラマーがダニエルのコードを見ると、「ああ、彼らはFactoryパターンを使用して、Scalaがデフォルトのコンストラクターをプライベートとしてマークできないことを補っています。待ってください、Scala はデフォルトのコンストラクターをプライベートとしてマークできます!ここに?!?" 言い換えれば、悪いWTF / LOC比率。
マルボリオ

20
@Malvolio私は全く同意しません。このパターンは、プライマリコンストラクターをプライベートにするだけでなく、実装も行い、ユーザーにインターフェイス(トレイト)の使用を強制します。それには独自の価値があります。言葉が分からないからといって考えている人も… ケニー・ティルトンを引用するには、いまいましい言語を学んでください!
ダニエルC.ソブラル

7
このアプローチがnewキーワードを使用しないことを意味することはどこかに言及されるべきです。
Travis Parks

1
このアプローチの注意点の1つは、誰かが独自の実装を通じてFooをインスタンス化できることです。これは、構造を制御する理由に応じて、長所または短所と見なすことができます。
aij

1
@aij True、それで、もう起こらないようにしたんだ。:)
ダニエルC.ソブラル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.