【问题标题】:Groovy way of null-checking constructor parameter空检查构造函数参数的Groovy方式
【发布时间】: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

【问题讨论】:

    标签: groovy


    【解决方案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,所有隐式方法和构造函数都不会检查参数不为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 2013-06-01
        • 2023-03-17
        相关资源
        最近更新 更多