2011-11-28 8 views
6

Quiero configurar todos los miembros de cadena de un objeto a una cadena vacía si son nulos.inicializar todos los miembros de la cadena con una cadena vacía

Pseudocódigo:

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

¿Cuál es la forma más sencilla para lograr eso? Cualquier marco/herramienta que pueda usar? ¿Escribir mi propia solución a través de la reflexión?

+1

¿Para qué? Es más fácil hacer eso en el método get() correspondiente, si siempre lo llamas, que afectar el valor real. – EJP

+0

Las clases son generadas por JAXB2, por lo que no quiero cambiarlas. – Sebi

+0

Si está utilizando un '.xsd' para definir el esquema para JAXB2, puede definir los valores' predeterminados' directamente en '.xsd'. – ante

Respuesta

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

Puede utilizar la reflexión para enumerar todos los campos de un objeto y luego comprobar y cambiarlo. Puede que tenga que modificar el nivel de acceso, si son privados. Puede encontrar muchos tutoriales al buscar en Google, p. this one.

0

Otra forma es escribir una utilidad que genera código que establece cadenas vacías a los miembros de objetos particulares.

0

A favor de diseño reutilizable se debe considerar el uso de un valor predeterminado para los valores nulos como API defaultString común de Apache, algo como esto:

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

También puede considerar el uso de defaultString(String str,String defaultStr) de modo que usted tiene la opción de cambiar el valor predeterminado a cualquier cosa si hubiera alguna razón para hacerlo.

StringUtils documentation

1

intenta utilizar 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; 
    } 
} 

Esto será más rápida en tiempo de ejecución porque este aspecto será compilado a código de bytes, de lo contrario reflexión se utilizará en Run- tiempo y ralentiza su aplicación.

Cuestiones relacionadas