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

2022-09-03 02:36:38

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

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)

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

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

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


答案 1

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

  • 从纯 Java 方面,您可以使用断言

     assert <condition> : <message>
    

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

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

  • 作为替代方法,您可以使用验证类: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");

答案 2

我想你可以使用Apache Commons Lang来做到这一点。它们在验证类中有很多验证方法。我不确定它是否足够富有表现力,但是如果你需要其他东西,那么自己写就可以了,不应该有太多的代码用于简单的检查。

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

干杯。


推荐