java 8+中是否有可用于替代番石榴前置条件的良好现场验证?

问题描述 投票:3回答:4

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

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的Preconditions类提供的详尽的验证列表,如下所示:

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

Java 8+中是否有更好的替代方法用于字段验证,这样我就不必为guava包含外部库了?

java validation java-8
4个回答
1
投票

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

  • 从纯Java方面,您可以使用assertassert <condition> : <message>

如果断言失败,AssertionError将与<message>一起投掷。

但是,您应该确保通过向JVM添加-ea属性来激活它。 断言为失败的案例添加更有意义的信息。

  • 作为替代方案,您可以使用apache-commons-lang Validate类: Validate.notNull(i, "this parameter can't be null") Validate.isTrue(i > 0, "The value must be greater than zero: %d", i);

0
投票

我想你可以使用Apache Commons Lang。他们在Validate class有很多验证方法。我不确定它是否足够表达,但如果你还需要其他任何东西,只为自己编写它就可以了,简单的检查应该没有太多的代码。

此外,如果您希望将这些检查集成到主要业务逻辑代码中(而不仅仅是单元测试),那么您应该查看Bean Validation。这样你绝对不会重新发明轮子,你的测试只需要从验证框架中得到例外。

干杯。


0
投票

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


0
投票

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

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

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

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

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

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

看看reference implementationn's documentation

© www.soinside.com 2019 - 2024. All rights reserved.