Scala中的私有和受保护的构造函数

Don*_*zie 107 scala

我一直很好奇Scala中没有明确的主要构造函数的影响,只是类体的内容.

特别是,我怀疑私有或受保护的构造函数模式,即通过伴随对象或另一个类或对象的方法控制构造可能没有明显的实现.

我错了吗?如果是这样,它是如何完成的?

Ale*_*tec 186

您可以通过在类名和参数列表之间插入适当的关键字将默认构造函数声明为private/protected,如下所示:

class Foo private () { 
  /* class body goes here... */
}
Run Code Online (Sandbox Code Playgroud)

  • Pag 414的"Scala编程".Wampler编程Scala的第97页.Subramaniam编程Scala的第60页.我现在没有PDF格式的Beginning Scala来查看它. (17认同)

Dan*_*ral 64

Aleksander的回答是正确的,但Scala中的Programming提供了另一种选择:

sealed trait Foo {
 // interface
}

object Foo {
  def apply(...): Foo = // public constructor

  private class FooImpl(...) extends Foo { ... } // real class
}
Run Code Online (Sandbox Code Playgroud)

  • @Malvolio我不太同意.此模式不仅使主构造函数成为私有,而且还使_implementation_强制用户使用接口(trait).这有其自身的价值.至于有人在想什么,因为他/她不懂语言 - piffle!引用肯尼蒂尔顿,[学习该死的语言](http://smuglispweeny.blogspot.com/2008/07/fear-no-evil-ii-or-why-solar-power.html)! (20认同)
  • 多年后突然说:我认为这是一个很好的答案,但问题解决不好.如果有一些未来的程序员使用Aleksander的代码,他会说"啊,主要构造函数是私有的,但其他构造函数不是." 如果该程序员要查看Daniel的代码,他会说,"啊,他们正在使用Factory模式来补偿Scala无法将默认构造函数标记为私有.等等,Scala的*可以*将默认构造函数标记为私有!在这里???" 换句话说,WTF/LOC比率较差. (18认同)
  • 应该在某处提到这种方法意味着不使用`new`关键字. (7认同)