Отбрасывание исключений во время построения обычно рассматривается как не очень вежливое, но я не уверен, как этого избежать, пытаясь обеспечить ограничение ограничений на значения класса case.
Скажем, например, что мне нужно представлять диапазон, и что обе границы должны быть положительными. Непосредственная реализация:
case class Range(from: Int, to: Int)
Это, однако, не гарантирует, что оба from и to положительны, а to больше, чем from.
Мой первый инстинкт - реализовать его следующим образом:
case class Range(from: Int, to: Int) {
require(from >= 0)
require(to >= 0)
require(to >= from)
}
Это, однако, делает конструктор Range небезопасным.
Существует ли общий шаблон, позволяющий упростить использование классов case, принудительное ограничение значений и избежать исключения исключений?