空检查构造函数参数的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 和没有参数的空构造函数之间的区别? [复制]

为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?

如何检查类型是不是提供无参数构造函数?

超类没有空构造函数,但没有给出参数