我真的很喜欢 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,是的,检查方法可能很笨拙。然而,在构造函数中检查空值看起来非常好,并且节省了大量调试 NPE 的时间:
public class SomeClassWithDependency {
private final SomeDependency someDependency;
public SomeClassWithDependency(SomeDependency someDependency) {
this.someDependency = checkNotNull(someDependency);
}
//...
编辑:接受 Nizet 的回答,因为我同意他关于副作用和一致性推理的观点。 此外,如果您查看 Xaerxess 评论,它看起来也会在其他开发人员中造成混淆。
最佳答案
checkNotNull
返回其参数的最大原因是它可以在构造函数中使用,如下所示:
public Foo(Bar bar) {
this.bar = checkNotNull(bar);
}
但是 checkArgument
没有做类似事情的主要原因是无论如何你都必须单独传递参数,这似乎不值得——尤其是在更复杂的情况下先决条件检查,有时在它们自己的行上更具可读性。仅仅因为某些东西可以是单行的并不意味着它应该是,如果它不增加可读性的话。
关于java - 为什么 Google Guava Preconditions 的 checkArgument 不返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709300/