2011-08-11 7 views
1

私はGroovyで微少なモデルを構築しようとしていますが、GroovyがGroovy Beanのコンストラクタでnull値を処理しているという問題を抱えています。要するにGroovy Beansの標準コンストラクタはnull値をどのように処理できますか?

計算結果の一つは、私が調査データが不足して最良の表現だろうと思ったかである、nullの場合、constructor method that Groovy offers

new Person(nrLegs:calculationResult1, nrArms:calculationResult2) 

IllegalArgumentExceptionをスローします。

これは私には変わったようです。変数double age;を値なしで定義すると、明らかにnullに設定されます。

double testDouble; 
assert testDouble == null; // no Problem 

私はGroovyの豆と同じことを行う場合、それは例えば、0.0の値があります。その後、

class Person { 
double age; 
int nrLegs, nrArms; 
} 

Person testPerson = new Person(nrArms:calculationResult1) 
assert testPerson.age == null; // Assertion failed. testPerson.age == 0.0 

さらに、私が使用してnullにプロパティを設定することはできませんGroovyの構文:

Person testPerson = new Person(nrArms:calculationResult1) 
testPerson.age = null; // IllegalArgumentException 

これはまさに上記の問題と同じようです。

なぜGroovyはnull値を割り当てることを禁じますか?

ありがとうございました!

を編集してください。参考のため、ここにはthe entire Person classStackTraceがあります。

答えて

5

問題はnullintタイプのBeanプロパティに割り当てようとしていることです。

intはプリミティブ型です。これはオブジェクトではないため、nullableではありません。値を持たなければなりません。これらはJavaの場合と同じ規則です。プリミティブ型はint,float,boolean,double,char ...です。オブジェクトの作成時には、プリミティブプロパティは0,0.0、falseなどに初期化されます。

「データなし」を表現する必要がある場合は、クラス定義を編集して、対応するオブジェクトラッパータイプ - この場合はInteger - nullに設定することができます。

クラスを編集できない場合は、一般的な回避策として、ある種のマーカー値を使用することがあります。 -1、またはInteger.MIN_VALUEなどです。しかし、Personクラスを操作するロジックは、マーカー値の意味を理解する必要があります

+0

変数の型を 'int'から' Integer'に変更すると本当に問題が解決します。ありがとう!しかし、それは**なぜ**の質問を提起しますか?まず、[Groovyには基本データ型がありません](http://www.vogella.de/articles/Groovy/article.html#datatypes)。第2に、私が提供した最初の例のように、 "原始"データ型( 'double'など)は、Groovyでnullに設定できます。これはバグですか? – mzuba

+0

Groovyにはプリミティブ型がありませんが、PersonクラスJavaではありませんか?(私はファイルサフィックスを見ずにはわかりません - それは '.java'ですか? - それは確かにJavaのようです)。 Groovyは自動的に 'unboxing'(オブジェクトとプリミティブ型の間の変換)によってコンパイルされたJavaクラスと相互運用する必要があります。元のIllegalArgumentExceptionを引き起こしていたのがこのアンボックスです。 'Person'クラスがjavaではなくgroovyとしてコンパイルされていることを確認することで、これを避けることができます。 – winstaan74

+0

ファイル拡張子は '.java'ではなく' .groovy'です。私はそれがGroovyとしてコンパイルされているかどうかはわかりませんが、そうでなければ 'new Person(age:xyz、nrCond:xyz) 'というメソッドがうまくいきません。 – mzuba

関連する問題