1

値オブジェクトを表すケースクラスの可視性を制御する価値はありますか? もしそうなら、ケースクラスの可視性修飾子で十分ですか、または明示的なコンパニオンオブジェクトとプライベートコンストラクターを使用する方が良いでしょうか?

バージョン 1:

case class MyClass private/protected/private[] {}

バージョン 2:

case class MyClass private

object MyClass {

  def apply = {

    new MyClass

  }
}

要するに、問題は、scala で値オブジェクトを処理する方法として要約できます。私は個人的に新しいことを強制したいので、オブジェクトの作成で何かを変更したいのですが、いつでも変更できます。つまり、必要に応じてコンパニオン オブジェクトを追加するだけです。

4

1 に答える 1

3

ケース クラス コンストラクターの可視性修飾子はコンパニオン オブジェクトに反映されないため、まったく同じ apply メソッドを使用して手動で作成する必要はありません。

これを自分で簡単に確認できます。

$ scala
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37).
Type in expressions to have them evaluated.
Type :help for more information.

scala> case class X private () {}
defined class X

scala> new X
<console>:10: error: constructor X in class X cannot be accessed in object $iw
              new X
              ^

scala> X()
res1: X = X()

プレーンXはコンパニオン オブジェクトの名前であることに注意してください。Xコンパニオン オブジェクトに名前を付けて新しいオブジェクトを取得することはできません。引数なしの apply が存在する場合でも、apply メソッドを呼び出しません。したがって、空のパラメータ リストを省略できません()

上記はすべて REPL に当てはまりますが、コンパイルされたコードは失敗します。

于 2014-08-23T19:54:30.660 に答える