从@Immutable注释中阻止空构造函数

时间:2014-11-26 13:57:59

标签: eclipse groovy null annotations immutability

我使用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帮助吗?

1 个答案:

答案 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

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