2012-06-25 5 views
2

В бульдозере как я глобально инициализировать значения на пустой объект, а не нулевойбульдозера - пустой объект, а не нулевой

Для Ex:

Class Person 
{ 
public Address address; 
//getters and setters for address 

} 

Class Address 
{ 
String addressField1; 
String addressField2; 
} 

Точно так же я объекты PersonVO и AddressVO, которые похожи на лицо и адрес

После отображения значений с помощью бульдозера, если значение адреса является недействительным в объекте Person, чем результат в personvo.getAddressVO.getAddressField1() выбросит исключения нулевого указателя, есть ли способ избегать этого?

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

ответ

0

Если вы можете изменить сеттер метод PersonVO класса, вы могли бы сделать следующим образом:

public void setAddressVO(AddressVO address) { 
    this.addressVO = address == null ? new AddressVO() : address; 
} 

Таким образом, вы будете уверены, что поле addressVO никогда не null.

Пожалуйста, обратите внимание, что это довольно грязный, потому что:

  1. если человек не имеет никакого адреса, его адрес поле должно быть null , а не пустой AddressVO объекта.
  2. настраиваемый сеттер, такой как . Это плохая практика, так как большинство пользователей вашего класса ожидают, что метод set установит значение и больше ничего не сделает. Вы можете по желанию создать новый метод initAddressVO и вызвать этот метод из dozer с использованием атрибута set-method в файле конфигурации.

Было бы гораздо лучше (если это возможно), чтобы проверить, если адрес является недействительным с некоторыми if избежать NullPointerException.

+0

У меня была схожая идея, проблема с проверкой на null заключается в том, что код, который будет обращаться к 'personvo.getAddressVO(). GetAddressField1()' является сгенерированным кодом из некоторого инструмента, и я не уверен, имеет ли он параметр создания нулевой проверки. –

0

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

Пустой объект: Объект, в котором нет нестатического элемента данных.

Null Object: Объект, который не имеет ссылки, т. Е. Нулевая ссылка;

0

Существует способ инициализации целевого объекта в Dozer.

  1. Определите заводский класс для объекта назначения.
  2. Укажите способ создания объекта назначения как метод в указанном выше классе.

Возьмем ваш пример, предположим, вы хотите сопоставить Person to PersonVO и адрес AddressVO.

Создание класса фабрики для PersonVO

public abstract class PersonVOFactory { 
    private PersonVOFactory() { 
    } 
    public static PersonVO createPersonVO() { 
     PersonVO personVO = new PersonVO(); 
     personVO.setAddressVO(new AddressVO()); 
     return personVO; 
    } 
} 

Укажите выше метод создания для лица в PersonVO отображение.

<mapping map-id="person-mapping"> 
    <class-a>Person</class-a> 
    <class-b create-method="PersonVOFactory.createPersonVO">PersonVO</class-b> 
    <field> 
     <a>address.addressField1</a> 
     <b>addressVO.addressField1</b> 
    </field> 
    <field> 
     <a>address.addressField2</a> 
     <b>addressVO.addressField2</b> 
    </field> 
</mapping> 

Теперь заявление, personvo.getAddressVO.getAddressField1() не будет бросать NPE.