2012-07-08 15 views
14

Estaba leyendo the docs y lo noté. Nunca lo imaginé. La descripción:¿El método toString() de String tiene algún propósito práctico?

Este objeto (que ya es una cadena!) Se devuelve.

Además de llenar las convenciones o el uso de los recursos informáticos, lo que hace un .toString() en Java hacer en un String que el uso de la String en sí no lo haría? ¿Por qué simplemente no hereda el .toString() de la clase java.lang.Object?

EDIT:

entiendo que en situaciones de polimorfismo de un método propio toString() tiene que existir ya que se hizo caso omiso de toString() su matriz. Lo que quiero saber en la primera pregunta es si hay alguna situación en la que obtendrá algo diferente entre usar stringVariable/"String value" y usar stringVariable.toString()/"String value".toString().

Ej. gr .: una operación de salida como System.out.println(stringVariable.toString()); o una asignación de valores como stringVariable = "String value".toString();.

+0

Hola. En caso de que no lo vea después de que se levante su suspensión, hay un comentario de JohnDoDo sobre la respuesta de Jon. FWIW, si regresa, considere la posibilidad de restablecer todas las respuestas no aceptadas; si fueron lo suficientemente buenas para aceptar en ese momento, esas personas útiles serán castigadas por un evento fuera de su control. – halfer

Respuesta

34

Además de cumplimentar convenciones o utilizar recursos informáticos, ¿qué hace un .toString() en Java en una cadena que no utiliza el String mismo?

Significa que da un resultado apropiado cuando se llama polimórficamente.

¿Por qué simplemente no hereda el .toString() de la clase java.lang.Object?

Debido a que no se daría el mismo resultado, y es casi seguro que no es el deseado resultado.

Object.toString() está destinado a proporcionar una representación de cadena razonablemente útil del objeto. La implementación Object proporciona información sobre el tipo y un valor que se puede utilizar para sugerencias de identidad cruda (útil desde el punto de vista del diagnóstico, pero eso es todo). Eso es claramente no la representación de cadena más útil para una cadena - la cadena sí mismo.

Mientras gustaría decir que es una lástima que toString se define en una manera muy choro (no está claro si el resultado es para la máquina, desarrollador o consumo del usuario), se siente obvio para mí que un String haría regresar a sí mismo en la implementación.

+5

El elemento 10 de Java eficaz explica algunas razones para evitar especificar 'toString()': porque alguien _invitablemente_ decidirá que es una buena idea analizarlo. –

+1

@TrevorTrovalds: ¿La documentación ya no responde eso? Devuelve "este objeto", por lo que no, no hay ninguna situación donde usar 'foo' y' foo.toString() 'dará un resultado diferente donde' foo' es una referencia no nula a 'String'. –

+2

@TrevorTrovalds: Um, ish - aunque yo * no * lo usaría para ese propósito. –

0

La implementación del método toString en java se realiza anulando el método ObjecttoString. El método java toString() se usa cuando necesitamos una representación de cadena de un objeto. Se define en la clase Object. Este método se puede anular para personalizar la representación String del Object.

0

Ejemplo práctico:

public abstract class MetadataProcessor { 

protected void processMetadata() {  
    Map<String, Object> metadata = getMetadata(); 
    for(String key : metadata.keySet()) { 
     if(metadata.get(key) instanceof Date) { 
     processDate(metadata.get(key)); 
    } else { //String or any other object type 
     processString(metadata.get(key).toString()); 
    } 
} 

private void processDate(Date date) { 
    (...) 
} 

private void processString(String string) { 
    (...) 
} 

/** 
* contains document's metadata, values must be String or Date 
**/ 
protected abstract Map<String, Object> getMetadata(); 
} 

si la cadena de.toString() no devolvería la cadena en sí, se necesitaría un if(foo instanceof String) adicional en el código anterior.

Cuestiones relacionadas