Scala 值对象可见性的案例类?

Scala 值对象可见性的案例类?,scala,case-class,companion-object,Scala,Case Class,Companion Object,控制表示值对象的case类的可见性是否值得?如果是这样,那么在case类上使用可见性修饰符就足够了,或者使用显式的伴随对象和私有构造函数会更好吗 第1版: case class MyClass private/protected/private[] {} 第2版: case class MyClass private object MyClass { def apply = { new MyClass } } 总之,问题可以概括为如何处理scala中的值对象。 我个人

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

第1版:

case class MyClass private/protected/private[] {}
第2版:

case class MyClass private

object MyClass {

  def apply = {

    new MyClass

  }
}
总之,问题可以概括为如何处理scala中的值对象。 我个人想要强制执行NoNew,所以我想在对象的创建过程中改变一些东西,我可以随时这样做。也就是说,只需在必要时添加一个伴生对象。

案例类构造函数上的可见性修饰符不会传播到伴生对象,因此不需要使用完全相同的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()
$scala
欢迎使用Scala版本2.11.2(Java热点(TM)64位服务器虚拟机,Java 1.6.037)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>case类X private(){}
定义类X
scala>新X
:10:错误:无法在对象$iw中访问类X中的构造函数X
新X
^
scala>X()
res1:X=X()
请注意,纯
X
是伴生对象的名称。您无法通过命名同伴对象获得新的
X
;即使不存在参数apply,也不会调用其apply方法。因此,不能忽略空参数列表
()


上述内容在REPL中都是正确的,但编译后的代码失败。

就是这样,我使用的是scala 2.11.2,执行此操作时出现了一个错误。到目前为止,这听起来像是防止直接新建,您需要自己编写伴生对象。只有当我这样做时,它才会像预期的那样工作。@MaatDeamon-编辑了我的答案,以表明它对于2.11.2是正确的。这真是奇怪,我在我的RELP中得到了与您相同的结果。但是,当我用intellij或sbt编译时,我不明白。当我在这里输入about是我得到的:[info]这是sbt 0.13.5[info]当前项目是{file:XXXXXX}ocean 0.0.1-SNAPSHOT[info]当前项目是根据Scala 2.11.2[info]构建的可用插件:sbt.Plugins.IvyPlugin,sbt.Plugins.JvmPlugin,sbt.Plugins.CorePlugin,sbt.plugins.JUnitXmlReportPlugin[info]sbt、sbt插件和构建定义都使用Scala 2.10.4