【问题标题】:What is the practical usage of Private Constructor in ScalaScala中私有构造函数的实际用法是什么
【发布时间】:2019-09-30 16:10:59
【问题描述】:

我浏览了以下链接。

What is the use of private constructor in Scala?

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

根据上面的链接,问题是

问题你想创建一个 Scala 类的主要构造函数 私有的,例如强制单例模式。

如果我不想暴露一个类的细节,我仍然可以通过另一种方式实现,此外,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 中使用私有构造函数?

【问题讨论】:

    标签: scala


    【解决方案1】:

    在这种情况下,您不能在代码的任何其他位置调用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)

    【讨论】:

    • 感谢您的回复,我以上面给出的链接为例。此外,我可以对年龄进行验证以避免负数。我的问题更多是关于这里使用私有构造函数的好处是什么。能否请您提供一个真实世界的例子?
    • @Sambit 我不是已经证明了吗?如果没有私有构造函数,您将如何处理上述情况。您将如何确保该对象不能用负数实例化。
    猜你喜欢
    • 2019-10-16
    • 2010-11-06
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多