在Java 8+中是否有可以替代guava PreConditions的良好字段验证?

sau*_*.in 8 java validation java-8

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

public static <T> T requireNonNull(T obj)
public static <T> T requireNonNull(T obj, String message)
Run Code Online (Sandbox Code Playgroud)

但是它仍然缺少番石榴的Preconditions类提供的详尽的验证列表,如下所示:

checkArgument(boolean) throws IllegalArgumentException
checkState(boolean) throws IllegalStateException
etc.
Run Code Online (Sandbox Code Playgroud)

Java 8+中是否有任何更好的方法可以进行字段验证,这样我就不必包括guava这样的外部库了?

naz*_*art 5

Java 8+(至12)没有这种方法(将来可能会出现一些变化)。

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

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

这种方法对于验证方法的参数更为可取。

  • `assert` 应该用于检查不变量,*不是*传入的参数值。 (2认同)

Doe*_*son 0

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

请记住,这些方法中的大多数只是简单的 if 条件,并且具有富有表现力的名称!

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

void assertionTest (@NotNull @PositiveOrZero Integer i) { ... }
Run Code Online (Sandbox Code Playgroud)

BV 对于大型应用有几个好处:

  • 减少混乱,您可以在单个位置定义约束
  • 许多有用的预定义约束
  • 自定义注释
  • 本地化的错误消息(可以轻松定制)
  • 验证复杂对象和对象图并考虑性能
  • 上下文感知验证
  • 与其他库和框架集成
  • 以及更多

查看参考实现的文档