java - 为什么 Google Guava Preconditions 的 checkArgument 不返回值?

标签 java guava argument-passing

我真的很喜欢 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/

相关文章:

java - Google Guava Cache,刷新过期超时

java - Guava CharMatcher 删除空格保留换行符

guava - 使用 Google Guava 进行不区分大小写的过滤

django - 传递参数 django 信号 - post_save/pre_save

javascript - 将多个参数传递给函数

java - 如何在数组列表中查找对象?

java - 上传 eclipse 项目/库以用作 gradle 依赖项

java - 在java中维护线程中变量的值

java - 使用 GSON 解析没有特定结构的字段的 JSON

c++ - 将 const double[][] 数组作为参数传递给 double** 接口(interface)