1

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

版本 1:

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

版本 2:

case class MyClass private

object MyClass {

  def apply = {

    new MyClass

  }
}

总而言之,这个问题可以概括为如何在 scala 中处理值对象。我个人想强制执行 no new,所以我想在创建对象时更改某些内容,我可以随时进行。也就是说,只需在必要时添加一个伴随对象。

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()

请注意,plainX是伴生对象的名称。你不能通过X命名伴生对象来获得新的;即使存在无参数 apply 也不会调用其 apply 方法。所以你不能省略空参数列表()

以上在 REPL 中都是正确的,但是编译的代码失败了。

于 2014-08-23T19:54:30.660 回答