Предотвращение создания экземпляров классов в 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
Конструктор является закрытым, поэтому создание экземпляра класса возможно только с помощью метода фабрики.