是否值得控制表示值对象的案例类的可见性?如果是这样,case类的可见性修饰符是否足够,或者使用显式伴随对象和私有构造函数会更好?
版本1:
case class MyClass private/protected/private[] {}
第2版:
case class MyClass private
object MyClass {
def apply = {
new MyClass
}
}
总之,这个问题可以归结为如何处理scala中的value对象。 我个人想强制执行no new,所以我想在对象的创建中改变一些东西,我可以随时做到。也就是说,只需在必要时添加一个伴随对象。
答案 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中都是如此,但编译后的代码失败了。