Breaking

Post Top Ad

Your Ad Spot

martes, 9 de julio de 2019

Métodos del objeto de Java: toString ()

Introducción

En este artículo, daré inicio a una serie de artículos que describen los métodos a menudo olvidados de la clase de objetos base del lenguaje Java. A continuación se muestran los métodos del objeto Java base, que están presentes en todos los objetos Java debido a la herencia implícita de Object. Los enlaces a cada artículo de esta serie se incluyen para cada método a medida que se publican los artículos.
En las secciones que siguen, describiré cuáles son estos métodos, sus implementaciones básicas y cómo anularlos cuando sea necesario. El enfoque de este primer artículo es el toString()método que se utiliza para dar una representación de cadena que identifica una instancia de objeto y transmite su contenido y / o significado en forma legible para humanos.

El método toString ()

A primera vista, el toString()método puede parecer un método bastante inútil y, para ser honesto, su implementación predeterminada no es muy útil. De manera predeterminada, el toString()método devolverá una cadena que enumera el nombre de la clase seguido de un signo @ y luego una representación hexadecimal de la ubicación de la memoria a la que se asignó el objeto instanciado.
Para ayudar a ayudar en mi discusión de los métodos omnipresentes del Objeto Java, trabajaré con una Personclase simple , definida así:
package com.adammcquistan.object;

import java.time.LocalDate;

public class Person {  
    private String firstName;
    private String lastName;
    private LocalDate dob;

    public Person() {}

    public Person(String firstName, String lastName, LocalDate dob) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.dob = dob;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public LocalDate getDob() {
        return dob;
    }

    public void setDob(LocalDate dob) {
        this.dob = dob;
    }
}
Junto con esta clase, tengo una Mainclase rudimentaria para ejecutar los ejemplos que se muestran a continuación para presentar las características de la implementación básica de toString().
package com.adammcquistan.object;

import java.time.LocalDate;

public class Main {  
    public static void main(String[] args) {
        Person me = new Person("Adam", "McQuistan", LocalDate.parse("1987-09-23"));
        Person me2 = new Person("Adam", "McQuistan", LocalDate.parse("1987-09-23"));
        Person you = new Person("Jane", "Doe", LocalDate.parse("2000-12-25"));
        System.out.println("1. " + me.toString());
        System.out.println("2. " + me);
        System.out.println("3. " + me + ", " + you);
        System.out.println("4. " + me + ", " + me2);
}
La salida se ve así:
1. com.adammcquistan.object.Person@458ad742  
2. com.adammcquistan.object.Person@458ad742  
3. com.adammcquistan.object.Person@458ad742, com.adammcquistan.object.Person@5afa04c  
4. com.adammcquistan.object.Person@458ad742, com.adammcquistan.object.Person@6ea12c19  
La primera cosa a mencionar es que la salida de las líneas de una y dos son idénticos, lo que demuestra que cuando se pasa una instancia de objeto a métodos como printprintlnprintf, así como madereros, el toString()método se llama implícitamente. 
Además, esta llamada implícita a toString()también ocurre durante la concatenación como se muestra en la salida de la línea 3.
Ok, ahora es el momento para que yo intervenga mi opinión personal cuando se trata de las mejores prácticas de programación de Java. ¿Qué se destaca de usted como potencialmente preocupante con respecto a la línea 4 (en realidad, cualquiera de los resultados para esa materia)?
Esperemos que esté respondiendo con una pregunta en este sentido, "bueno, Adam, es bueno que la salida me diga el nombre de la clase, pero ¿qué diablos debo hacer con esa dirección de memoria de gobly-gook?".
Y yo respondería con "¡Nada!". Es un 99.99% inútil para nosotros como programadores. Una idea mucho mejor sería anular esta implementación predeterminada y proporcionar algo que sea realmente significativo, como esto:
public class Person {  
    // omitting everyting else remaining the same

    @Override
    public String toString() {
        return "<Person: firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob + ">";
    }
}
Ahora, si vuelvo a ejecutar la clase principal anterior, obtendré la siguiente salida mejorada:
1. <Person: firstName=Adam, lastName=McQuistan, dob=1987-09-23>  
2. <Person: firstName=Adam, lastName=McQuistan, dob=1987-09-23>  
3. <Person: firstName=Adam, lastName=McQuistan, dob=1987-09-23>, <User: firstName=Jane, lastName=Doe, dob=2000-12-25>  
4. <Person: firstName=Adam, lastName=McQuistan, dob=1987-09-23>, <User: firstName=Adam, lastName=McQuistan, dob=1987-09-23>  
¡DIOS MIO! Algo que yo pueda leer! Con esta implementación ahora tengo la oportunidad de ser capaz de comprender lo que está pasando en un archivo de registro. Esto es especialmente útil cuando el soporte técnico grita sobre el comportamiento errático relacionado con las instancias de People en el programa que estoy buscando.

Advertencias para implementar y usar toString ()

Como se muestra en la sección anterior, implementar un toString()método informativo en sus clases es una buena idea, ya que proporciona una manera de transmitir de manera significativa el contenido y la identidad de un objeto. Sin embargo, hay ocasiones en las que querrá adoptar un enfoque ligeramente diferente para implementarlas.
Por ejemplo, supongamos que tiene un objeto que simplemente contiene demasiado estado para empaquetar en la salida de un toString()método o cuando el objeto contiene principalmente una colección de métodos de utilidades. En estos casos, a menudo es aconsejable dar una descripción simple de la clase y sus intenciones.
Considere la siguiente clase de utilidad sin sentido que encuentra y devuelve a la persona más antigua de una lista de objetos People.
public class OldestPersonFinder {  
    public List<Person> family;

    public OldestPersonFinder(List<Person> family) {
        this.family = family;
    }

    public Person oldest() {
        if (family.isEmpty()) {
            return null;
        }
        Person currentOldest = null;
        for (Person p : family) {
            if (currentOldest == null || p.getDob().isAfter(currentOldest.getDob())) {
                currentOldest = p;
            }
        }
        return currentOldest;
    }

    @Override
    public String toString() {
        return "Class that finds the oldest Person in a List";
    }
}
En este caso, no sería muy útil recorrer toda la colección de Personobjetos en el Listmiembro de la instancia de familia y construir una cadena ridículamente grande para devolver cada uno de ellos PersonEn cambio, es mucho más significativo devolver una cadena que describa las intenciones de la clase, que en este caso es encontrar Personquién es el más antiguo.
Otra cosa que me gustaría sugerir es que me asegure de proporcionar acceso a toda la información específica de los datos de su clase que incluya en la salida de su toString()método.
Digamos, por ejemplo, que no había proporcionado un método de obtención para Personel dobmiembro de mi clase en un vano intento de mantener en secreto la edad de la persona. Desafortunadamente, los usuarios de mi Personclase finalmente se darán cuenta de que simplemente pueden analizar la salida del toString()método y adquirir los datos que buscan de esa manera. Ahora, si alguna vez cambio la implementación de toString(), estoy casi seguro de romper su código. Por otro lado, permítanme decir que generalmente es una mala idea ir a analizar la toString()salida de un objeto por esta misma razón.

Conclusión

Este artículo describe los usos y el valor en el toString()método a menudo olvidado de la clase de objetos base de Java. He explicado el comportamiento predeterminado y he dado mi opinión sobre por qué creo que es una mejor práctica implementar su propio comportamiento específico de clase.
Como siempre, gracias por leer y no tenga miedo de comentar o criticar a continuación.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas