【发布时间】:2024-01-12 05:12:02
【问题描述】:
我真的很喜欢 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;
}
}
我只是想知道这是设计使然,是否值得为此提出功能请求。
编辑:@Nizet,是的,检查方法可能很笨拙。但是,在构造函数中检查 null 看起来非常好,并且可以节省大量用于调试 NPE 的时间:
public class SomeClassWithDependency {
private final SomeDependency someDependency;
public SomeClassWithDependency(SomeDependency someDependency) {
this.someDependency = checkNotNull(someDependency);
}
//...
编辑:接受 Nizet 的回答,因为我同意他的副作用和一致性推理。 此外,如果您查看 Xaerxess 评论,它看起来也会在其他开发人员中引起混淆。
【问题讨论】:
-
除了您使用
checkArgument(T ref, boolean expr)的示例外,最近还有一个issue #1038 讨论Preconditions.checkArgument(T ref, Predicate<T> test)被拒绝。您始终可以使用自己的方法创建Preconditions2类。
标签: java guava argument-passing