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