Groovy Beans标准构造函数如何处理空值?

时间:2011-08-11 08:23:20

标签: groovy javabeans null

我正在尝试使用Groovy构建一个微模拟模型,但是我遇到了一个问题,我追溯到Groovy在Groovy Bean构造函数中处理null值。

简而言之,constructor method that Groovy offers

new Person(nrLegs:calculationResult1, nrArms:calculationResult2)
如果其中一个计算结果为空,

会抛出IllegalArgumentException,这就是我认为缺失的调查数据最能代表的方式。

这对我来说似乎很奇怪:如果我定义一个没有值的变量double age;,它显然会设置为null。

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

如果我对Groovy bean执行相同操作,则其值为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

此外,我无法使用Groovy语法将属性设置为null:

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

这似乎与上述问题完全相同。

为什么Groovy会禁止我分配空值?

感谢您的帮助!

修改:供参考,此处为the entire Person classStackTrace

1 个答案:

答案 0 :(得分:5)

问题在于您尝试将null分配给int类型的bean属性。

int是一种原始类型。它不是一个对象,因此不可为空:它必须有一个值。这些规则与Java相同 - 原始类型为intfloatbooleandoublechar ....在对象创建时,基本属性初始化为0,0.0,false等

如果需要表示“无数据”,那么最好编辑类定义,以便bean属性使用相应的对象包装类型 - 在本例中为Integer - 然后可以将其设置为{ {1}}。

如果您无法编辑课程,那么常见的解决方法是使用某种标记值 - 例如null,或-1,或某些人。但是操纵Person类的逻辑需要理解标记值的重要性