我想在我的应用程序的方法中添加字段验证(例如,字段不为空且为正(。
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
来验证自定义Exception
或RuntimeException
类
Optional.ofNullable(someVariables)
.orElseThrow(
() ->
new CustomException("Some message"));