Considerar la costumbre toString() implementación de un bean:

@Override
public String toString() {
    String.format("this is %s", this.someField);
}

Este rendimientos this is null si someField es nulo.

Hay una manera para reemplazar el valor predeterminado null representación de cadena de valores null argumentos a otro texto, es decir, ? sin llamar explícitamente replaceAll(...) en el toString método?

Nota: El frijol hereda de la superclase que podría implementar Formattable ( http://docs.oracle.com/javase/7/docs/api/java/util/Formattable.html ), pero me parecen que no entienden cómo hacer este trabajo.

EDITAR: El fragmento de código se sobre-simplificado para el bien de ejemplo, pero yo no estoy buscando operador ternario soluciones someField==null ? "?" : someField porque:

  • no puede ser que (potencialmente) un gran número de campos que intervienen en toString() para la comprobación de todos los campos es demasiado engorroso y no con fluidez.
  • otras personas a las que me tienen poco control sobre (si las hay) están escribiendo sus propias subclases.
  • si se llama a un método y devuelve el valor null que pueda implicar la llamada al método dos veces o la declaración de una variable local.

Más bien, se puede hacer algo usando el Formattable interfaz o tener alguna costumbre Formatter (que es final btw.)?

  • Yo haría String.format("this is %s", this.someField==null?"?":this.someField);
  • O con Guayaba : String.format("this is %s", Objects.firstNotNull(this.someField, "?"));
  • Siempre pienso que el cariño de firstNotNull, esp. implementaciones similares algunos dialectos SQL, pero la Guayaba es demasiado pesada a la dependencia y pertenece más a las dependencias de una clase Utils que la de un pojo, de la omi.
  • Hay algunos grandes soluciones. Claro que no se puede elegir a uno a aceptar?
  • La mayoría, si no todos, de alguna manera de abordar la cuestión y, en última instancia, producir un resultado compatible con la pregunta, aunque en algunos gastos. Dicho esto, me objetivamente no se puede afirmar que me puede elegir una respuesta como verdaderamente superior, por lo tanto: no, en esta etapa me temo que no puedo.
InformationsquelleAutor VH-NZZ | 2013-12-05

10 Comentarios

  1. 34

    Con java 8 ahora puede utilizar la clase Opcional para esto:

    import static java.util.Optional.ofNullable;
    ...
    String myString = null;
    System.out.printf("myString: %s",
        ofNullable(myString).orElse("Not found")
    );
  2. 21

    La mejor solución, en mi opinión, es el uso de la Guayaba Objetos del método, firstNonNull. El siguiente método se asegurará de que se va a imprimir una cadena vacía si someField es siempre null.

    String.format("this is %s", MoreObjects.firstNonNull(this.someField, ""));

    La guayaba docs.

    • String.format("this is %s", StringUtils.defaultIfBlank(this.someField, "")); va a hacer el truco si Apache StringUtils pasa a estar en el classpath.
  3. 19

    Para Java 7 solución que no requiere de librerías externas:

    String.format("this is %s", Objects.toString(this.someField, "?"));
    • Oh… me gusta esto!!!
  4. 5

    Si usted no desea utilizar replaceAll(), Se puede asignar un valor predeterminado de texto(String) para someField.

    Pero si en algún momento esto puede asignar null de nuevo. Así que usted puede utilizar la validación para el caso de

     this.someField == null ? "defaultText" : this.someField
  5. 5

    Un poco tarde sobre el tema, pero esto podría ser una muy limpias-en busca de la solución :
    En primer lugar, crear su propio formato método de…

    private static String NULL_STRING = "?";
    
    private static String formatNull(String str, Object... args){
        for(int i = 0; i < args.length; i++){
            if(args[i] == null){
                args[i] = NULL_STRING;
            }
        }
    
        return String.format(str, args);
    }

    A continuación, utilice como va…

    @Test
    public void TestNullFormat(){
        Object ob1 = null;
        Object ob2 = "a test";
    
        String str = formatNull("this is %s", ob1);
        assertEquals("this is ?", str);
    
        str = formatNull("this is %s", ob2);
        assertEquals("this is a test", str);
    }

    Esto elimina la necesidad de múltiples, difíciles de leer, ternario operadores.

    • … sino que implica una dependencia en su formatNull método.
    • Por supuesto! A menos que el caso forementionned es específico para algunas de salida de la estrategia de clase, donde el método se puede definir de forma privada en la propia estrategia. Entonces no habría depenedency problema. Si se utiliza en muchos lugares de la aplicación, entonces sí que tendría que ser puesto en alguna biblioteca / util de la clase.
  6. 3

    Para evitar la repetición de operador ternario se puede envolver en más legible método que comprobará si su objeto es null y la devolución de algún valor predeterminado si es cierto como

    static <T> T changeNull(T arg, T defaultValue) {
        return arg == null ? defaultValue : arg;
    }

    uso

    String field = null;
    Integer id = null;
    System.out.printf("field is %s %n", changeNull(field, ""));
    System.out.printf("id is %d %n", changeNull(id, -1));
    System.out.printf("id is %s %n", changeNull(field, ""));

    de salida:

    field is  
    id is -1 
    id is  
  7. 2

    Sólo podría hacer

    String.format("this is %s", (this.someField==null?"DEFAULT":this.someField));
    • De nuevo, esto es usando el operador ternario. Gracias de todos modos.
  8. 1

    Para mantener el valor original de someField (en caso de que null es un valor válido), se puede utilizar un operador ternario.

    String.format("This is %s", (this.someField == null ? "unknown" : this.someField));
  9. 1
    public static String format(String format, Object... args){
        for (int i=0;i<args.length;i++){
            if (args[i]==null) args[i]="";
        }
        return String.format(format,args);
    }

    a continuación, utilice el método ,aceptar

  10. 1

    A partir de java 7, puede utilizar Objects.toString(Object o, String nullDefault).

    Aplicado a su ejemplo: String.format("this is %s", Objects.toString(this.someField, "?"));

Dejar respuesta

Please enter your comment!
Please enter your name here