在Java中,其最常见的用法之一是定义Singleton类。但是,由于Scala中没有“静态”类,私有构造函数的用法有哪些例子?
答案 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()
,...