В Scala как получить доступ к приватному конструктору класса case из его сопутствующего объекта
У меня определен следующий код (в Scala IDE/Scala Worksheet с Scala 2.10):
object WorkSheet1 {
object A {
def apply(s: String, huh: Boolean = false): A = A(s)
}
case class A (s: String)
//case class A private (s: String)
val a = A("Oh, Hai")
}
И я успешно получаю следующий вывод:
a: public_domain.WorkSheet1.A = A (О, Хай)
Тем не менее, когда я закомментирую существующий case class A (s: String)
и раскомментировав другой (содержащий "private"), я получаю следующую ошибку компилятора: "конструктор A в классе A не может быть доступен в объекте WorkSheet1".
Насколько я понимаю, объект-компаньон имел доступ ко всем частным частям своего класса-компаньона. Хех. Э-э... серьезно. Что дает?
1 ответ
Решение
Сделайте это приватным для всех, кроме как
object WorkSheet1 {
object A {
def apply(s: String, huh: Boolean = false): A = A(s)
}
case class A private[A](s: String)
val a = A("Oh, Hai", false)
}
Я добавил false, чтобы решить неоднозначность между объектом apply и конструктором класса case, который является публично видимым.