Как стандартные конструкторы Groovy Beans могут работать с нулевыми значениями? - PullRequest
1 голос
/ 11 августа 2011

Я пытаюсь построить модель микросимуляции с помощью Groovy, но у меня возникла проблема, связанная с обработкой нулевыми значениями в Groovy конструкторов Groovy Bean.

Короче говоря, метод конструктора , который предлагает Groovy

new Person(nrLegs:calculationResult1, nrArms:calculationResult2)

, выдает IllegalArgumentException, если один из результатов вычисления равен нулю, как я и считал отсутствующимлучше всего представить данные опроса.

Это то, что мне кажется странным: если я определяю переменную double age; без значения, она, очевидно, устанавливается в ноль.

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

Более того, я не могу установить нулевые свойства, используя синтаксис Groovy:1021 *

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

Кажется, это та же проблема, что и выше.

Почему Groovy запрещает мне присваивать нулевые значения?

Спасибо за вашу помощь!

Редактировать : для справки: весь класс Person и StackTrace .

1 Ответ

5 голосов
/ 11 августа 2011

Проблема в том, что вы пытаетесь присвоить null свойству бина типа int.

int - это примитивный тип.Это не объект, и поэтому он не обнуляем: он должен иметь значение.Это те же правила, что и для Java - примитивные типы: int, float, boolean, double, char ....При создании объекта свойство примитива инициализируется равным 0, 0,0, ложью и т. Д.

Если вам нужно представить «нет данных», то, вероятно, лучше отредактировать определение класса, чтобы свойство бина использовалосоответствующий тип обёртки объекта - в данном случае Integer - который затем можно установить на null.

Если вы не можете редактировать класс, то обычным способом решения проблемы является использование какого-либо значения маркера - например, -1, или Integer.MIN_VALUE, или что-то подобное.Но тогда логике, которая манипулирует классом Person, нужно понять значение значения маркера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...