eclipse – 防止@Immutable注释中的空构造函数

我使用groovy和
@Immutable annotation一样.问题是,这个注释不仅创建具有指定类字段的构造函数,而且还创建一个空构造函数并允许字段部分保持为空(或采用默认值).我想阻止这个.

例:

@Immutable class User { int age}

可以这样称呼

User jasmin = new User(30)
println "I am ${jasmin.age} years old" // I am 30 years old

还喜欢

User james = new User() //Uhoh, I have no age
println "I am ${james.age} years old" // I am 0 years old - maybe not expected

我的问题是:有没有任何注释或其他方法阻止调用空构造函数?在运行时没有传递年龄(或为null传递)时可能抛出异常.如果我获得eclipse IDE支持,那么在编译时eclipse会抱怨空构造函数调用.

我没有找到类似@NotNull的groovy,但对于java我发现了不同的注释为the ones in this question.会使用其中一个好主意吗?怎么决定?或者编写自己的自定义注释更好 – 我可以通过这样做获得IDE帮助吗?

最佳答案 我同意你的看法; @Immutable属性中应该有一个选项来防止生成默认构造函数.

至于一种解决方法,这可能并不像你想的那么优雅,但我把它扔到那里.如果在没有默认构造函数的情况下创建可变超类型,则可以使用@Immutable版本对其进行扩展.例如:

import groovy.transform.*

class MutableUser {
    int age
    // defining an explicit constructor suppresses implicit no-args constructor
    MutableUser(int age) { 
        this.age = age 
    }
}

@Immutable
@InheritConstructors
class User extends MutableUser {
}

User jasmin = new User() // results in java.lang.NoSuchMethodError

但总的来说,这似乎是一个不必要的样板,只是为了压制一个无参数的构造函数.

点赞