Ответ 1
Это довольно субъективно, но я попробую.
Это зависит от того, как построен ваш класс. В случае простого класса класса полезности, используемого случайно во внутреннем коде, любой программист, использующий его, должен, вероятно, знать, что подача неправильных значений диапазона может привести к странным результатам. Вы можете предположить, что разумное использование классов действительно не сталкивается с этой проблемой, и бросать исключение в этих редких случаях может быть плохой практикой, чтобы сигнализировать, что кто-то действительно испортил. Если из контекста видно, какие ценности следует подавать в класс или нет, я не думаю, что особенно плохо, если вы отказываетесь от этих ожиданий здравого смысла.
Сравните это с поведением NullPointerException
или ArithmethicException
, которое по-прежнему происходит внутри Scala. Иногда просто не разумно программировать оборонительно, когда сталкивается с достаточно "безумием".
С другой стороны, если ваш класс заполнен значениями, у вас меньше контроля, т.е. они являются прямым следствием ввода пользователя, вам нужно просто взять больше контроля над своей конструкцией. Создайте объект-компаньон с функцией, которая возвращает Option
или Either
:
object Range {
def createSafe(from: Int, to: Int): Option[Range] = {
if(from >= 0 && to >= 0 && to >= from)
Some(Range(from, to))
else
None
}
}
Затем вы можете повторно использовать логику проверки в создании экземпляра вашего класса case, переопределив apply
, как и предложил другой ответ.
object Range {
def createSafe ...
def apply(from: Int, to: Int): Range = {
createSafe(from, to).getOrElse(throw new IllegalArgumentException(...))
}
}