Каково практическое использование частного конструктора в Scala? - PullRequest
1 голос
/ 30 сентября 2019

Я перешел по следующим ссылкам.

Какая польза от частного конструктора в Scala?

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

СогласноПо приведенной выше ссылке проблема задается как

Проблема Вы хотите сделать первичный конструктор класса Scala закрытым, например, для принудительного применения шаблона Singleton.

ЕслиЯ не хочу раскрывать детали класса, я все еще могу достичь по-другому, кроме того, Object в Scala - это 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 Ответ

4 голосов
/ 30 сентября 2019

В этом случае, вы не можете позвонить new Brian в любое другое место вашего кода. Если вы удалите private, то вы могли бы. Тогда класс Brian больше не будет одноэлементным (сопутствующий объект все еще будет одним) .
В любом случае, это не лучшийпример того, почему вам может понадобиться закрытый конструктор, поскольку никто не будет кодировать синглтон таким образом, у нас есть 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...