Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的私有和受保护构造函数_Scala - Fatal编程技术网

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

Scala中的私有和受保护构造函数,scala,Scala,我一直很好奇Scala中没有显式的主构造函数的影响,只是类主体的内容 特别是,我怀疑私有或受保护的构造函数模式,即通过伴随对象或其他类或对象的方法控制构造,可能没有明显的实现 我错了吗?如果是这样,它是如何实现的?您可以通过在类名和参数列表之间插入适当的关键字,将默认构造函数声明为private/protected,如下所示: class Foo private () { /* class body goes here... */ } 的答案是正确的,但提供了另一种选择: sealed

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

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


我错了吗?如果是这样,它是如何实现的?

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

class Foo private () { 
  /* class body goes here... */
}
的答案是正确的,但提供了另一种选择:

sealed trait Foo {
 // interface
}

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

  private class FooImpl(...) extends Foo { ... } // real class
}

您可以有一个Scala singleton(即带有object关键字),并在该singleton中将类定义为private,还可以使用singleton的方法来构造对象。@Paggas,不幸的是,当您返回一个标记为private的类的实例时,它将无法编译,即使从方法返回,它也是范围内的伴生对象。这在Scalaz源代码中大量使用。这个概念也被称为抽象代数数据类型。谢谢Aleksander,你能告诉我这是在scala的书中还是在语言规范中提出的吗?很抱歉,我还不能升级。我只是浏览了一下“编程Scala”对构造函数的解释(第92-95页),我没有看到这里提到它。事实上,我在一个旧的变更日志中找到了你问题的答案,但我以前从未在其他地方提到过。链接:“Scala编程”第414页。Wampler的编程Scala第97页。Subramaniam的编程Scala第60页。我现在还没有一份开始使用Scala的PDF文档可以查看。哦,我现在在第97页看到了。谢谢。感谢两人的进一步研究,我有一本Wampler的书,但只是在我的手机上,显然还没有彻底阅读,但我发现它对Odersky的书的补充出人意料地好。几年后突然说:我认为这是一个很好的答案,但解决问题的方法不好。如果某个未来的程序员使用Aleksander的代码,他会说“啊,主构造函数是私有的,但其他构造函数不是。”如果该程序员查看Daniel的代码,他会说,“啊,他们使用工厂模式来补偿Scala无法将默认构造函数标记为私有的缺陷。等等,Scala可以将默认构造函数标记为private!这是怎么回事?!?“换句话说,WTF/LOC比率不好。@Malvolio我不太同意。这种模式不仅使主构造函数私有,而且使实现私有,迫使用户使用接口(trait)。这有它自己的价值。对于那些因为不懂语言而思考的人来说——piffle!引用Kenny Tilton的话,!应该在某个地方提到,这种方法意味着不使用
new
关键字。这种方法的一个警告是,有些人仍然可以通过自己的实现实例化一个Foo根据控制施工的原因,这将被视为一种优势或劣势。@aij是真的,所以我只是这样做,这样就不会再发生了。:)