Проверка в диапазоне предварительных условий - PullRequest
3 голосов
/ 22 ноября 2011

Мне нравятся предварительные условия для гуавы, но что мне действительно нужно, так это еще один способ - проверить, что число находится в диапазоне.Вот так

//probably there should be checkStateInRange also
public static void checkArgumentInRange(double value, int min, int max) {
    if (value < min || value > max) {
        throw new IllegalArgumentException(String.format("%s must be in range [%s, %s]", value, min, max));
    }
}

Полагаю, я не одинок, и это довольно распространенный случай.Но такого метода не существует.Есть ли причины не ставить такие методы в com.google.common.base.Preconditions?

Ответы [ 2 ]

8 голосов
/ 22 ноября 2011

Я бы сказал, что есть немало причин. Вот основные из них:

  • Нет стандартного типа исключения Java для значения вне диапазона. Обратите внимание, что каждый из методов Preconditions генерирует определенный тип исключения для проверки: NullPointerException, IllegalArgumentException, IllegalStateException или IndexOutOfBoundsException. Обобщенная проверка диапазона не будет иметь более специфического исключения, чем IllegalArgumentException для броска.
  • checkArgument и checkState делают все, что вам нужно. Вы можете просто написать checkArgument(value >= min && value <= max, ...). Это просто и очевидно, что вы проверяете.

Дополнительно:

  • Здесь слишком много разных комбинаций, которые вам могут понадобиться. Эксклюзивные / включающие границы, как упоминается в @rsp и т. Д.
  • Ограничение разрешено только int s для границ, поэтому вы действительно хотели бы разрешить любые Comparable там.
  • В этот момент вы замечаете, что просто проверяете, содержится ли значение в диапазоне .
5 голосов
/ 22 ноября 2011

Я думаю, что вы можете очень близко подойти, используя checkArgument():

checkArgument(min < value && value < max, "%s must be in range [%s, %s]", value, min, max);

, который, если вы добавляете строки сообщений к своим собственным определениям констант, не слишком стандартен и обладает всей гибкостью, которую вы можете использовать.необходимо.

...