我使用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
我的问题是:是否有任何注释或其他方法阻止调用空构造函数?在运行时没有传递age
(或为其传递null)时可能抛出异常。如果我获得eclipse IDE支持,那么在编译时eclipse会抱怨空构造函数调用。
我没有找到像@NotNull这样的groovy,但是对于java我发现了不同的注释the ones in this question。会使用其中一个好主意吗?怎么决定?或者编写我自己的自定义注释是否更好 - 我可以通过这样做获得IDE帮助吗?
答案 0 :(得分:2)
我同意你的意见; @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
但总的来说,这似乎是一个不必要的样板,只是为了压制一个无参数的构造函数。