2011-11-28 14 views
6

Chcę ustawić wszystkie elementy String obiektu na pusty łańcuch, jeśli są one puste.Inicjalizuj wszystkie elementy String za pomocą pustego ciągu

Pseudokod:

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

Co jest najprostszym sposobem, aby to osiągnąć? Wszelkie ramy/narzędzia, z których mogę korzystać? Napisz własne rozwiązanie za pomocą refleksji?

+1

W jakim celu? Łatwiej jest to zrobić w odpowiedniej metodzie get(), jeśli zawsze ją wywołujesz, niż wpływać na rzeczywistą wartość. – EJP

+0

Klasy są generowane przez JAXB2, więc nie chcę ich zmieniać. – Sebi

+0

Jeśli używasz '.xsd' do zdefiniowania schematu dla JAXB2, możesz zdefiniować wartości' default' bezpośrednio w '.xsd'. – ante

Odpowiedz

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

Możesz użyć odbicia, aby wyświetlić wszystkie pola obiektu, a następnie sprawdź i zmień. Może być konieczne zmodyfikowanie poziomu dostępu, jeśli są one prywatne. Możesz znaleźć wiele tutoriali na ten temat podczas wyszukiwania w Google, np. this one.

0

Innym sposobem jest napisanie narzędzia, które generuje kod, który ustawia puste ciągi na członków poszczególnych obiektów.

0

Na rzecz wielokrotnego użytku projektowania należy rozważyć użycie domyślnej wartości dla wartości null podobnie jak Apache wspólnego defaultString API, coś takiego:

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

Można również rozważyć użycie defaultString(String str,String defaultStr), dzięki czemu mają możliwość zmiana wartości domyślnej na cokolwiek powinna być jakakolwiek przyczyna.

StringUtils documentation

1

próbować używać 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; 
    } 
} 

To będzie szybciej w czasie wykonywania, ponieważ ten aspekt będzie kompilowany do kodu bajtowego, inaczej odbicie zostaną wykorzystane w Uruchom- czas i spowalnia aplikację.

Powiązane problemy