用于值对象可见性的Case类



控制表示值对象的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中都是正确的,但是编译后的代码会失败。

最新更新