Предотвращение создания экземпляров классов в Scala с использованием Factory Pattern

Предположим, что у меня есть следующий класс, определенный в Scala:

class ClassA(val n: Int) {
   ...
}

Я хочу ограничить экземпляры этого класса только теми, которые имеют n от 5 до 10, используя Factory Pattern. Например, если я напишу что-то вроде:

val a = new ClassA(11)

Это вызывает исключение с соответствующим сообщением об ошибке, или, по крайней мере, возвращает ноль или что-то еще. Как я могу добиться этого поведения?

Обновить:

Этого можно добиться в Java с помощью фабричного шаблона.

Update2:

На эти вопросы, похоже, здесь дан ответ, особенно с подробным заголовком. Я настраиваю заголовок и содержание, чтобы сохранить удаляемый вопрос, по двум причинам: 1) пример в этом краткий, 2) предоставленный ответ @Chris Martin кратко объясняет, как можно получить шаблон Factory в Scala с помощью Сопутствующие объекты.

1 ответ

Решение

Обычный способ написать фабрику в Scala - определить apply метод на объекте-компаньоне.

Вот пример использования Either (так как null никогда / редко используется в Scala, а исключения ужасны):

class A private (n: Int) {
  override def toString = s"A($n)"
}

object A {
  def apply(n: Int): Either[String, A] =
    if (n < 5) Left("Too small")
    else if (n > 10) Left("Too large")
    else Right(new A(n))
}

A(4)  // Left(Too small)
A(5)  // Right(A(5))
A(11) // Left(Too large)

По сути, это то же самое, что и пример Java, на который вы ссылались. A Конструктор является закрытым, поэтому создание экземпляра класса возможно только с помощью метода фабрики.

Другие вопросы по тегам