Java - как упростить мой Java - PullRequest
3 голосов
/ 04 мая 2011

Я пишу некоторый Java-код в Spring Framework.

У меня есть два компонента: person и person1.Они имеют немного другую структуру, то есть имена переменных для каждого отличаются незначительно.

Я пытаюсь скопировать детали из одного компонента в другой.Я только хочу скопировать значение, если значение не является нулевым.Я видел API под названием BeanUtils, но он будет копировать его независимо от того, является он нулевым или нет.

Вот мой код:

if (person != null) {
       if (person.getAddressDetails() != null) {
               if (person.getAddressDetails().getStreetNumber() != null) {
                       person1.getAddressDetails().setStreetNo(person.getAddressDetails().getStreetNumber());
               }

               if (person.getAddressDetails().getStreetName() != null) {
                       person1.getAddressDetails().setStreetName(person.getAddressDetails().getStreetName());
               }
       }

       if (person.getHomeDetails() != null) {
               if (person.getHomeDetails().getPhoneNumber() != null) {
                       person1.getHomeDetails().setSPhoneNo(person.getHomeDetails().getPhoneNumber());
               }
       }
}

У меня есть около 40 узлов, которые нужно скопировать, и это создало бы столько уродливого кода.У кого-нибудь есть лучший способ сделать это?может быть, если я сделаю отображение или что-то, а затем перебрать его?не уверен.

Если нет, кто-нибудь знает, могу ли я заставить BeanUtils запускать копию, не копируя нулевые значения?

Причина в том, что второй компонент, person1, уже имеет набор значений,Я только хочу перезаписать это, если есть новые значения, чтобы перезаписать его.

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

Спасибо

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

Подходя к проблеме с другой стороны, ваш исходный объект данных не должен заботиться об ограничениях или требованиях бизнес-логики вашего целевого объекта.

Это будет жесткая связь , и это плохоособенно если вы используете Spring, вы делаете именно то, что контейнер IoC, например Spring, пытается вам , а не .

Вставьте кодировку null checking в setXXX().методы целевого объекта, это правильное место для обработки бизнес-правила, если вы не хотите устанавливать целевые свойства, если исходное свойство равно null.

public setXXX(final String s)
{
  if (s == null) { // do nothing }
  else { this.xxx = s; }
}

, тогда вы можете использоватькакую бы стратегию / библиотеку карт вы ни выбрали и не беспокоиться о состоянии исходных данных null.Слепо устанавливая свойства и позволяя цели решать, когда игнорировать входящий null.

2 голосов
/ 04 мая 2011

Интересно, может ли Dozer помочь тебе?

...