Как динамически объединять объекты Java - PullRequest
5 голосов
/ 06 октября 2011
public class MyClass{
   public String elem1;
   public int elem2;
   public MyType elem3;
.................
}

MyClass object1=new MyClass();
MyClass object2=new MyClass();
object1.elem1=...
object1.elem2=...
...
object2.elem1=...
object2.elem2=null
.....

То, что я хочу, это что-то вроде

object1.merge(object2);

где он будет динамически проходить по всем членам MyClass и запускать это на каждом члене

if(object1.elem != object2.elem && object2.elem!=null)
 object1.elem=object2.elem;

Существует ли такой механизм в Java?

Ответы [ 5 ]

8 голосов
/ 06 октября 2011

использовать отражение.пройти через поля класса.Psuedo:

Field[] fields = aClass.getFields();
for (Field field : fields) {
     // get value
     Object value = field.get(objectInstance);
     // check the values are different, then update 
     field.set(objetInstance, value);    
}

и соответствует значениям.если они отличаются, обновите значение.

2 голосов
/ 06 октября 2011

Опция, более эффективная, чем Reflection, будет хранить поля на карте:

Map<String, Object> fields;

void merge(MyClass other){
    for (String fieldName : fields.keys()){
        Object thisValue = this.fields.get(key);
        Object otherValue = other.fields.get(key);
        if (thisValue != otherValue && otherValue != null){

                this.fields.put(fieldName, otherValue);
        }
    }
}

Это сделает слияние более эффективным, но сделает общий доступ к полям менее эффективным.

1 голос
/ 06 октября 2011

Вы можете написать такой метод самостоятельно, используя отражение (начните с Class.getFields()), но в стандартных API нет такого инструмента.

0 голосов
/ 06 октября 2011

Там нет ничего встроенного. Однако вы можете взглянуть на Dozer .Возможно, с некоторыми изменениями он сможет это сделать.

Вы также можете сделать это с помощью отражения (что и делает Dozer).

0 голосов
/ 06 октября 2011

Да, это возможно, и это называется Отражение .

...