值对象可见性的案例类?

时间:2014-08-23 19:38:08

标签: scala case-class companion-object

是否值得控制表示值对象的案例类的可见性?如果是这样,case类的可见性修饰符是否足够,或者使用显式伴随对象和私有构造函数会更好?

版本1:

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

第2版:

case class MyClass private

object MyClass {

  def apply = {

    new MyClass

  }
}

总之,这个问题可以归结为如何处理scala中的value对象。 我个人想强制执行no new,所以我想在对象的创建中改变一些东西,我可以随时做到。也就是说,只需在必要时添加一个伴随对象。

1 个答案:

答案 0 :(得分: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方法。因此,您不能省略空参数列表()

以上在REPL中都是如此,但编译后的代码失败了。