2011-10-06 10 views
5
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 
..... 

Lo que quiero es algo así comoCómo combinar objetos Java de forma dinámica

object1.merge(object2); 

donde atravesará dinámicamente todos los miembros de MiClase y ejecutar esto en cada miembro de

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

es tal una mecanismo existe en Java?

Respuesta

8

use reflection. repase los campos de clase. 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);  
} 

y coincide con los valores. si difieren, luego actualiza el valor.

1

Puede escribir ese método usted mismo usando la reflexión (comience con Class.getFields()), pero no hay ninguna herramienta que haga esto en las API estándar.

0

No hay nada incorporado. Sin embargo, es posible que desee echar un vistazo a Dozer. Tal vez con algunos ajustes será capaz de hacer esto.

También puede hacerlo utilizando la reflexión (que es lo que hace Dozer).

2

Una opción que es más eficiente que la reflexión sería la de almacenar los campos en un mapa:

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); 
     } 
    } 
} 

Esto haría que la combinación más eficiente, pero haría que el acceso campo general menos eficiente.

Cuestiones relacionadas