2017-04-01 1 views
2

Hinweis Dies ist kein Multithreading-Fall Alter Wert wird im Cache gespeichert, neuer Wert wird vom Server abgerufen und der endgültige Wert wird aktualisiert - einer, der erneut im Cache gespeichert wird.Zwei Klassenmitglieder in neue Final Klasse mappen

Ihre beiden Objekt der Klasse Name

  • obj-> Alte Werte,
  • obj1-> Neue Werte.

Recquried

  • obj3-> Endgültige Ausgabe.

Alte Werte

class A{ 
String name="abc"; 
String email="[email protected]"; 
String phone="123456789"; 
} 

Neue Werte

class A{ 
String name="xyz"; 
String email=""; 
} 

Wollen Sie alte Werte mit neuen Werten nur aktualisieren, wenn sie einige aktualisierte Inhalte in neuen Werten ist.

Wie in obigem Fall

  1. Name akzeptiert wird, wie es ändert
  2. E-Mail wird nicht akzeptiert, da sie leer ist.
  3. Telefon hat keinen Wert so abgelehnt.

fertige Ausgabe ist:

class A 
{ 
    String name="xyz"; 
    String email="[email protected]"; 
    String phone="123456789"; 
} 

Ist sie jede einfache Lösung, um es einfach

+0

Jackson können vorhandene Objekte aktualisieren. Werfen Sie einen Blick auf diese Antwort, die einen ähnlichen Anwendungsfall hat (Patchen eines Objekts): http://stackoverflow.com/questions/42976804/java-mapper-patcher-for-pojo/42977044#42977044 – john16384

+0

@ john16384 Ist dies möglich mit GSON. Derzeit verwende ich Retrofit mit GSON –

+0

Ich bin mir nicht sicher, ob es mit GSON möglich ist, müssen Sie untersuchen :) – john16384

Antwort

0
You can make a get property to return the final class like so: 

class A { 
    String name ="abc"; 
    String email ="[email protected]"; 
    String phone ="123456789"; 

    public A getFinalA(A a){ 
     if(a.name != null) name = (name == a.name ? name : a.name); 
     if(a.email != null) email= (email == a.email ? email : a.email); 
     if(a.phone!= null) phone= (phone== a.phone? phone: a.phone); 

     A finalA = new A(); 
     A.name = name; 
     A.email = email; 
     A.phone = phone; 
    } 
} 
+0

Dank für Wiederholung ist ihre Möglichkeit, diese Überprüfung zu vermeiden, weil ich 30 Mitglieder in der Klasse haben. –

+0

Diese Überprüfung wird nur einmal in einer Klasse stattfinden. –

1

Haben Sie versucht, durch eine Unterklasse der BeanUtilsBean der org.commons.beanutils definieren Paket? Eigentlich verwendet BeanUtils diese Klasse.

Bei der Überprüfung der source code dieser Klasse, ich denke, Sie können die CopyProperty-Methode überschreiben, indem Sie nach Null-Werten und nichts tun, wenn der Wert null ist.

Etwas wie folgt aus:

package foo.bar.copy; 
import java.lang.reflect.InvocationTargetException; 
import org.apache.commons.beanutils.BeanUtilsBean; 

public class NullAwareBeanUtilsBean extends BeanUtilsBean{ 

    @Override 
    public void copyProperty(Object dest, String name, Object value) 
      throws IllegalAccessException, InvocationTargetException { 
    if(value==null || StringUtils.isEmpty(ObjectUtils.identityToString(value))) { 
     return; 
    } 
     super.copyProperty(dest, name, value); 
    } 

} 

Dann können Sie einfach einen NullAwareBeanUtilsBean instanziiert und es verwenden, Ihre Bohnen zu kopieren, zum Beispiel:

BeanUtilsBean checkNullAnd=new NullAwareBeanUtilsBean(); 
checkNullAnd.copyProperties(dest, orig); 

Also, dieser Code tun Alles wird, ist es überprüft auf null oder leere Objekte und ersetzt sie nicht durch das alte.

ref: here

+0

Danke für die Wiederholung Ich werde es auschecken, Was tatsächlich passiert, verwendet derzeit GSON, um die Antwort automatisch auf die Klasse zuzuordnen, also habe ich keinen Hinweis, welcher Update ist. So, wie man den oben genannten Fall verwendet –

+0

Hey hast du irgendeine Lösung dafür? –

+0

Sie können die Antwort überprüfen, es behebt mein Problem. –

0

Verwendung unter Klasse nur die Werte zu aktualisieren, die nicht null sind und unter Methode verwenden.

Coppier.kopieren (oldInstance, newInstance);

public class Coppier { 
    private static final String GETTER_EXPRESSION = "(get)([A-Z]\\w+)"; 
    private static final String SETTER_EXPRESSION = "(set)([A-Z]\\w+)"; 
    private static final String SETTER_REPLACE_EXPRESSION = "set$2"; 
    private static final Pattern GETTER_PATTERN = Pattern.compile(GETTER_EXPRESSION); 
    private static final Pattern SETTER_PATTERN = Pattern.compile(SETTER_EXPRESSION); 

    private static void copy(Object from, Object to, Set<String> whitelist, Set<String> blacklist) { 
     for (Method method : from.getClass().getDeclaredMethods()) { 
      String name = method.getName(); 
      if (whitelist != null && !whitelist.contains(name)) { 
       continue; 
      } 
      if (blacklist != null && blacklist.contains(name)) { 
       continue; 
      } 
      if (Modifier.isPublic(method.getModifiers()) && isGetter(method)) { 
       Method setter = getSetterForGetter(to, method); 
       if (setter != null) 
        try { 
         String setterName = setter.getName(); 
         if (!(setterName.equals("setWalletAmount") || setterName.equals("setId"))) { 
          Object product = method.invoke(from); 
          setter.invoke(to, product); 
         } 
        } catch (IllegalAccessException e) { 
        // 
        } catch (InvocationTargetException e) { 
        // 
        } 
      } 
     } 
    } 

    public static void copy(Object from, Object to) { 
     copy(from, to, null, null); 
    } 

    private static boolean isGetter(Method method) { 
     return isGetter(method.getName()); 
    } 

    private static boolean isGetter(String methodName) { 
     return GETTER_PATTERN.matcher(methodName).matches(); 
    } 

    private static boolean isSetter(Method method) { 
     return isSetter(method.getName()); 
    } 

    private static boolean isSetter(String methodName) { 
     return SETTER_PATTERN.matcher(methodName).matches(); 
    } 

    private static String getSetterNameFromGetterName(String methodName) { 
     return methodName.replaceFirst(GETTER_EXPRESSION, SETTER_REPLACE_EXPRESSION); 
    } 

    private static Method getSetterForGetter(Object instance, Method method) { 
     String setterName = getSetterNameFromGetterName(method.getName()); 
     try { 
      return instance.getClass().getMethod(setterName, method.getReturnType()); 
     } catch (NoSuchMethodException e) { 
      return null; 
     } 
    } 
} 
Verwandte Themen