Частный и защищенный конструктор в Scala

Мне было интересно узнать о том, что не имеет явного основного конструктора в Scala, просто содержимое тела класса.

В частности, я подозреваю, что частный или защищенный шаблон конструктора, то есть управление конструкцией через объект-компаньон или другие методы класса или объекта, может не иметь очевидной реализации.

Неужели я ошибаюсь? Если да, то как это делается?

Ответ 1

Вы можете объявить конструктор по умолчанию как private/protected, вставив соответствующее ключевое слово между именем класса и списком параметров, например:

class Foo private () { 
  /* class body goes here... */
}

Ответ 2

Aleksander ответ правильный, но Программирование в Scala предлагает дополнительную альтернативу:

sealed trait Foo {
 // interface
}

object Foo {
  def apply(...): Foo = // public constructor

  private class FooImpl(...) extends Foo { ... } // real class
}