Scala中私有构造函数的实际用法是什么

时间:2019-09-30 16:10:59

标签: scala

我已经浏览了以下链接。

What is the use of private constructor in Scala?

https://alvinalexander.com/scala/how-to-define-private-primary-constructor-singleton-scala

根据上面的链接,问题表示为

  

问题您想成为Scala类的主要构造函数   私有,例如强制使用Singleton模式。

如果我不想公开一个类的细节,我仍然可以用另一种方式实现,此外,Scala中的Object是Singleton。

请帮助我从Scala语言角度了解私有构造函数的实际用法。

我在下面提供的代码可以理解。

class Brain private {
  override def toString = "This is the brain."
}

object Brain {
    val brain = new Brain
    def getInstance = brain
}

object SingletonTest {
  def main(args: Array[String]) {
    val brain = Brain.getInstance
    println(brain)
  }
}

我想了解这里的优点是什么,因此我们必须在Scala中使用私有构造函数?

1 个答案:

答案 0 :(得分:4)

在这种情况下,是您不能在代码的任何其他位置调用new Brian。如果删除private,则可以。然后 Brian 类将不再是单例(伴随的 object 仍将是一个)
无论如何,这都不是为什么您想要私有构造函数的最佳示例,因为没有人会以这种方式编码单例,因此我们有object

一个更好的例子是这样的:

final case class Person private (name: String, age: Int)

object Person {
  /** Returns None if the age is invalid, a Some with a new person otherwise. */
  def apply(name: String, age: Int): Option[Person] =
    if (age > 0 && age < 100) Some(new Person(name, age))
    else None
}

这样,您可以确保 Person 的任何实例具有有效的年龄。
如果将构造函数公开,则不再适用,因为有人可能会new Person("name", -1)