Мне очень нравится, как библиотека guava позволяет использовать простые однострочники для проверки на null:
public void methodWithNullCheck(String couldBeNull) {
String definitelyNotNull = checkNotNull(couldBeNull);
//...
}
к сожалению, для простой проверки аргументов вам нужно как минимум две строки кода:
public void methodWithArgCheck(String couldBeEmpty) {
checkArgument(!couldBeEmpty.isEmpty());
String definitelyNotEmpty = couldBeEmpty;
//...
}
однако можно добавить метод, который мог бы выполнять проверку аргументов и возвращать значение, если проверка прошла успешно. Ниже приведен пример проверки и того, как ее можно реализовать:
public void methodWithEnhancedArgCheck(String couldBeEmpty) {
String definitelyNotEmpty = EnhancedPreconditions.checkArgument(couldBeEmpty, !couldBeEmpty.isEmpty());
//...
}
static class EnhancedPreconditions {
public static <T> T checkArgument(T reference, boolean expression) {
if (!expression) {
throw new IllegalArgumentException();
}
return reference;
}
}
Мне просто было интересно, так ли это по замыслу и стоит ли для этого запрашивать функцию.
EDIT: @Nizet, да, методы проверки могут быть неуклюжими. Однако проверка конструкторов на нулевые значения выглядит действительно хорошо и экономит много времени, затрачиваемого на отладку NPE:
public class SomeClassWithDependency {
private final SomeDependency someDependency;
public SomeClassWithDependency(SomeDependency someDependency) {
this.someDependency = checkNotNull(someDependency);
}
//...
EDIT: принимаю ответ Низе, потому что я согласен с ним в отношении побочных эффектов и рассуждений о согласованности. Кроме того, если вы посмотрите на комментарий Xaerxess, похоже, что это вызывает путаницу и у других разработчиков.
checkArgument(T ref, boolean expr)
недавно возникла проблема # 1038 обсуждениеPreconditions.checkArgument(T ref, Predicate<T> test)
было отклонено. Вы всегда можете создать классPreconditions2
со своими методами. - person Xaerxess   schedule 30.07.2012