2011-11-28 11 views
6

Desidero impostare tutti i membri String di un oggetto su una stringa vuota se sono nulli.Inizializza tutti i membri String con una stringa vuota

Pseudocodice:

foreach member in object { 
    if (member instanceof String and member == null) { 
     member = ''; 
    } 
} 

Qual è il modo più semplice per raggiungere questo obiettivo? Qualunque framework/strumento che posso usare? Scrivi la mia soluzione tramite riflessione?

+1

Per quale scopo? È più facile farlo nel corrispondente metodo get(), se lo si chiama sempre, piuttosto che influenzare il valore effettivo. – EJP

+0

Le classi sono generate da JAXB2, quindi non voglio cambiarle. – Sebi

+0

Se si utilizza un '.xsd' per definire lo schema per JAXB2 è possibile definire i valori' default' direttamente in '.xsd'. – ante

risposta

5
public static void setEmpty(Object object) throws IllegalArgumentException, IllegalAccessException { 
    Class<?> clazz = object.getClass(); 
    Field[] fields = clazz.getDeclaredFields(); 
    for (Field field : fields) { 
     if (String.class.equals(field.getType())) { 
      field.setAccessible(true); 
      if (field.get(object) == null) { 
       field.set(object, ""); 
      } 
     } 
    } 
} 
1

È possibile utilizzare la riflessione per elencare tutti i campi di un oggetto e quindi controllarlo e modificarlo. Potrebbe essere necessario modificare il livello di accesso, se sono privati. Puoi trovare molti tutorial su questo durante la ricerca di Google, ad es. this one.

0

Un altro modo è scrivere un'utilità che genera codice che imposta stringhe vuote per i membri di oggetti particolari.

0

A favore del design riutilizzabile si dovrebbe considerare l'utilizzo di un valore predefinito per i valori nulli, proprio come API DefaultString comune di Apache, qualcosa di simile:

public String getValue(String value){ 
    return StringUtils.defaultString(value); 
} 

Si può anche considerare l'utilizzo di defaultString(String str,String defaultStr) in modo da avere la possibilità di cambiare il valore predefinito in qualsiasi cosa dovrebbe esserci una ragione per farlo.

StringUtils documentation

1

tenta di utilizzare AspectJ:

@Aspect 
public class StringHandler { 
    @Around("execution(String com....YourClass.*(*))") 
    public Object handle(ProceedingJoinPoint thisJoinPoint) throws Throwable { 
     String s = (String) thisJoinPoint.proceed(); 
     if (s == null){ 
      return ""; 
     } 
     return s; 
    } 
} 

Questo sarà più veloce in fase di esecuzione, perché questo aspetto sarà compilato al byte-code, altrimenti riflessione saranno utilizzati a run- tempo e rallenta la tua app.

Problemi correlati