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

mzu*_*uba 1 null groovy javabeans

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

简而言之,Groovy提供构造方法

new Person(nrLegs:calculationResult1, nrArms:calculationResult2)
Run Code Online (Sandbox Code Playgroud)

IllegalArgumentException如果其中一个计算结果为空,则抛出一个,这就是我认为缺失的调查数据最能代表的方式.

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

double testDouble;
assert testDouble == null; // no Problem
Run Code Online (Sandbox Code Playgroud)

如果我对Groovy bean执行相同操作,则其值为0.0,例如:

class Person {
double age;
int nrLegs, nrArms;
}
Run Code Online (Sandbox Code Playgroud)

然后

Person testPerson = new Person(nrArms:calculationResult1) 
assert testPerson.age == null; // Assertion failed. testPerson.age == 0.0
Run Code Online (Sandbox Code Playgroud)

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

Person testPerson = new Person(nrArms:calculationResult1) 
testPerson.age = null; // IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)

这似乎与上面完全相同.

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

谢谢你的帮助!

编辑:作为参考,这里是整个Person类StackTrace.

win*_*n74 5

问题是您正在尝试分配类型null的bean属性int.

int是一种原始类型.它不是一个对象,因此不可为空:它必须有一个值.这些都是相同的规则爪哇-原始类型int,float,boolean,double,char....在对象创建时,基本属性初始化为0,0.0,false等.

如果你需要表示'无数据',那么最好编辑类定义,以便bean属性使用相应的对象包装类型 - 在这种情况下Integer- 然后可以设置为null.

如果你无法编辑课程,那么常见的工作就是使用某种标记值 - 例如-1,或者Integer.MIN_VALUE,或者某些.但是操纵Person类的逻辑需要理解标记值的重要性