Java 8+ 中是否有一个很好的字段验证可以取代番石榴前提条件



我想在我的应用程序的方法中添加字段验证(例如,字段不为空且为正(。

private void assertionTest(Integer i) {
    // want to first assert here that i is not null and positive 
    // something like: 
    // Preconditions.checkArgument( i != null && i > 0, "i should be non null positive number!" );
    // 
    System.out.println( "i: " + i);
}

Java 8引入了Objects类,该类具有一些用于空检查验证的基本实用程序方法:

public static <T> T requireNonNull(T obj)
public static <T> T requireNonNull(T obj, String message)

但它仍然缺乏 guava 的前提条件类提供的详尽验证列表,如下所示:

checkArgument(boolean) throws IllegalArgumentException
checkState(boolean) throws IllegalStateException
etc.

Java 8+ 中是否有更好的字段验证替代方案,这样我就不必为此包含番石榴等外部库?

Java 8+ (直到12(没有这样的方法(也许将来会出现一些变化(。

  • 从纯 Java 端,您可以使用 assert:

     assert <condition> : <message>
    

如果断言失败AssertionError则抛出 <message> .

但是,您应该确保通过将-ea属性添加到 JVM.
来激活它断言向失败的案例添加更有意义的信息.
但是,断言的目的不是检查方法参数。因此,请看一下第二种方法。

  • 作为替代方法,您可以使用apache-commons-lang验证类:

     Validate.notNull(i, "this parameter can't be null")
     Validate.isTrue(i > 0, "The value must be greater than zero: %d", i);
    

此方法更适合验证方法的参数。

<小时 />

如果你使用的是Spring框架,你可以使用Assert类。

Snipept From documentattion - 断言实用程序类,可帮助验证参数。

用法如下所示:

Assert.notNull(clazz, "The class must not be null");
Assert.isTrue(i > 0, "The value must be greater than zero");
我想

你可以使用Apache Commons Lang。他们在验证类中有很多验证方法。我不确定它是否足够富有表现力,但如果您需要其他任何东西,可以自己编写它,应该没有太多用于简单检查的代码。

此外,如果要将这些检查集成到主业务逻辑代码(不仅仅是单元测试(中,则应查看 Bean 验证。这样,您绝对不会重新发明轮子,并且您的测试只需要期望来自验证框架的异常。

干杯。

IMO的最佳解决方案是只使用

if (! test) { throws new Illegal[Argument|State]Exception (message + badparameteror) }

即使是Guava的作者也对使用他们的验证方法有着复杂的感觉,特别是如果性能是一个问题。

如果你发现自己对一个特定的类做了很多事情,你可以创建一个辅助方法,但我敦促你不要要求整个库进行琐碎的验证。

我使用 spring 验证,但有时我通过扩展 spring 验证来控制一些自定义行为来编写验证

如果您更喜欢验证方法,为什么不自己编写呢?很多人都这样做。它简单、快速,不需要任何外部依赖项。

请记住,如果条件具有表达性名称,则这些方法中的大多数都很简单!

然后是JSR 380,又名"Bean Validation"。它允许您使用注释定义验证约束:

void assertionTest (@NotNull @PositiveOrZero Integer i) { ... }

BV对于大型应用具有以下几个优点:

  • 减少混乱,您可以在一个位置定义约束
  • 许多有用的预定义约束
  • 自定义注释
  • 本地化的错误消息(可以轻松自定义(
  • 验证复杂对象和对象图,同时考虑性能
  • 情境感知验证
  • 与其他库和框架集成
  • 等等

查看参考实现的文档

有时我使用java.util.Optional来验证自定义ExceptionRuntimeException

Optional.ofNullable(someVariables)
          .orElseThrow(
              () ->
                  new CustomException("Some message"));

最新更新