我已经浏览了以下链接。
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中使用私有构造函数?
答案 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)
。