Scala中私有构造函数的用途是什么?

时间:2017-03-13 14:22:48

标签: scala

在Java中,其最常见的用法之一是定义Singleton类。但是,由于Scala中没有“静态”类,私有构造函数的用法有哪些例子?

2 个答案:

答案 0 :(得分:13)

您可以访问类的伴随对象中的私有构造函数。

这允许您创建替代方法来创建类的新实例,而不会暴露内部构造函数。

我想出了一个如何使用它的非常简单的例子:

class Foo private(s: String)

object Foo {
  def apply(list: Seq[String]): Foo = {
    new Foo(list.mkString(","))
  }
}

现在,您可以在不使用Foo关键字的情况下创建new的新实例,而不会暴露内部构造函数,从而封装内部实现。

这一点尤为重要,因为未来内部实施可能会发生变化,而面向公众的API应保持向后兼容

答案 1 :(得分:1)

私有构造函数的用例大多与Java中的用例相同:有时您需要完全控制如何创建类的实例。考虑scala.immutable.Vector。它的构造函数相当复杂:

final class Vector[+A] private(val startIndex: Int, val endIndex: Int, focus: Int)

此构造函数是一个复杂的实现细节,将来可能会更改,因此不应向用户公开。相反,您提供简单的工厂方法,隐藏创建向量实例的所有复杂性:Vector.apply()Vector.tabulate()Vector.fill(),...