空检查构造函数参数的Groovy方式
Posted
技术标签:
【中文标题】空检查构造函数参数的Groovy方式【英文标题】:Groovy way of null-checking constructor parameter 【发布时间】:2020-06-01 07:14:57 【问题描述】:我想将非空值注入到我的 groovy 类中
class MyClass
private final String foo
private final Integer bar
MyClass(String foo, Integer bar)
// wanted ctr body
...
在构造函数中,我想将参数分配给各个字段 AND 防止空值。
我想知道是否有比相当冗长的更时髦的方式来做到这一点
assert foo != null
assert bar != null
this.foo = foo
this.bar = bar
或
this.foo = Objects.requireNonNull foo
this.bar = Objects.requireNonNull bar
【问题讨论】:
【参考方案1】:如果您使用 Groovy 3,则可以使用添加防御条件构造函数(或任何方法)参数的 @NullCheck
注释。
import groovy.transform.NullCheck
@NullCheck
class MyClass
private final String foo
private final Integer bar
MyClass(String foo, Integer bar)
this.foo = foo
this.bar = bar
// Examples:
new MyClass("test", null) // throws IllegalArgumentException("bar cannot be null")
new MyClass(null, "test") // throws IllegalArgumentException("foo cannot be null")
当您在类定义级别添加@NullCheck
时,防御性空检查将应用于所有构造函数和方法。或者,您可以将@NullCheck
注释添加到您只想使用此空值检查的方法(或构造函数)。
在 Groovy 3 之前,此类防御性检查必须手动实现。
【讨论】:
【参考方案2】:只是一个重要的细微差别,因为 @NullCheck 注释仅适用于 explicit 方法和构造,如官方文档中所述。
http://docs.groovy-lang.org/next/html/gapi/groovy/transform/NullCheck.html
如果放在类级别,所有显式方法和构造函数都会被检查。
如果你使用其他注解作为@TupleConstructor,所有隐式方法和构造函数都不会检查参数不为空。
【讨论】:
以上是关于空检查构造函数参数的Groovy方式的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 groovy 中使用映射强制来模拟具有带参数的构造函数的类吗?
=default 和没有参数的空构造函数之间的区别? [复制]