2014-11-26 3 views
4

Я использую groovy и люблю @Immutable annotation. Проблема заключается в том, что эта аннотация не только создает конструкторы с указанными полями классов, но также создает пустой конструктор и позволяет полям оставаться в нуле (или принимать значение по умолчанию). Я хочу предотвратить это.предотвратить пустые конструкторы от @Immutable аннотации

Пример:

@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 передано (или пустым для него) во время выполнения. Бонусные точки, если я получаю поддержку IDE eclipse, чтобы пустой вызов конструктора был жалуен eclipse во время компиляции.

Я не нашел что-то вроде @NotNull для groovy, но для java я нашел разные аннотации как the ones in this question. Использовал бы одну из них хорошую идею? Как решить? Или лучше написать мою собственную аннотацию - и могу ли я получить помощь IDE, выполнив это?

ответ

2

Я согласен с тобой; должна быть опция в атрибуте @Immutable, чтобы предотвратить генерацию конструктора по умолчанию.

Что касается обходного пути, это, вероятно, не так элегантно, как хотелось бы, но я выбрасываю это. Если вы создаете mutable super type без конструктора по умолчанию, вы можете расширить его с помощью версии @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 

Но в целом, это кажется ненужным количеством шаблонного просто подавить конструктор без аргументов.

+0

Это также не помогает мне с аргументами с нулевым значением. Я хочу добиться, чтобы ни один аргумент не был «null». Тем не менее он помогает вызывать пустой конструктор, но также получает помощь от аннотации, имеющей конструктор-карту. Я думаю, мне нужно больше копать в аннотации и преобразование АСТ и создавать свою собственную NotNull Annotation в groovy ... – valenterry

Смежные вопросы