我使用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
但总的来说,这似乎是一个不必要的样板,只是为了压制一个无参数的构造函数.