Método Java toString ()

Método Java toString ()

1. Visão geral

Cada classe em Java é filha da classeObject direta ou indiretamente. E como a classeObject contém um métodotoString() , podemos chamartoString() em qualquer instância e obter sua representação de string.

Neste tutorial, veremos o default behavior of toString() and learn how to change its behavior.

2. Comportamento padrão

Sempre que imprimimos uma referência de objeto, ele invoca o métodotoString() internamente. Então, se não definirmos um métodotoString() em nossa classe, entãoObject#toString() é invocado.

O métodoObject’stoString() é bastante genérico:

public String toString() {
    return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

Para ver como isso funciona, vamos criar umCustomer objeto que usaremos em todo o nosso tutorial:

public class Customer {
    private String firstName;
    private String lastName;
    // standard getters and setters. No toString() implementation
}

Agora, se tentarmos imprimir nosso objetoCustomer,Object #toString() será chamado e a saída será semelhante a:

[email protected]

3. Substituindo o comportamento padrão

Olhando para a saída acima, podemos ver que ela não nos dá muitas informações sobre o conteúdo do nosso objetoCustomer. Generally, we aren’t interested in knowing the hashcode of an object, but rather the contents of our object’s attributes.

Substituindo o comportamento padrão do métodotoString() , podemos tornar a saída da chamada do método mais significativa.

Agora, vamos examinar alguns cenários diferentes usando objetos para ver como podemos substituir esse comportamento padrão.

4. Tipos primitivos eStrings

Nosso objetoCustomer tem atributosStringe atributos primitivos. Precisamos substituir o métodotoString() para obter uma saída mais significativa:

public class CustomerPrimitiveToString extends Customer {
    private long balance;

    @Override
    public String toString() {
        return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }
}

Vamos ver o que obtemos quando chamamostoString() neve:

@Test
public void givenPrimitive_whenToString_thenCustomerDetails() {
    CustomerPrimitiveToString customer = new CustomerPrimitiveToString();
    customer.setFirstName("Rajesh");
    customer.setLastName("Bhojwani");
    customer.setBalance(110);
    assertEquals("Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]",
      customer.toString());
}

5. Objetos Java complexos

Vamos agora considerar um cenário onde nosso objetoCustomer também contém um sattributeorder que é do tipoOrder. Nosso sclassOrder tem campos de tipo de dadosStringe primitivos.

Então, vamos substituirtoString() novamente:

public class CustomerComplexObjectToString extends Customer {
    private Order order;
    //standard setters and getters

    @Override
    public String toString() {
        return "Customer [order=" + order + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }
}

Comoorder é um objeto complexo, se apenas imprimirmos nosso objetoCustomer, sem sobrescrever o métodotoString() em nossa classeOrder, ele imprimiráorders) s como[email protected]<hashcode>.

Para corrigir isso, vamos substituirtoString() emOrder também:

public class Order {

    private String orderId;
    private String desc;
    private long value;
    private String status;

    @Override
    public String toString() {
        return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]";
    }
}

Agora, vamos ver o que acontece quando chamamos o smethodtoString() em nosso objetoCustomer que contém um tributoorder :

@Test
public void givenComplex_whenToString_thenCustomerDetails() {
    CustomerComplexObjectToString customer = new CustomerComplexObjectToString();
    // .. set up customer as before
    Order order = new Order();
    order.setOrderId("A1111");
    order.setDesc("Game");
    order.setStatus("In-Shiping");
    customer.setOrders(order);

    assertEquals("Customer [order=Order [orderId=A1111, desc=Game, value=0], " +
      "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString());
}

6. Matriz de objetos

A seguir, vamos mudar nossoCustomer para ter um array deOrders _._ Se apenas imprimirmos nosso objetoCustomer, sem tratamento especial para nosso objetoorders, ele imprimiráorders comoOrder;@<hashcode>.

Para corrigir isso, vamos usarArrays.toString()  para o campoorders:

public class CustomerArrayToString  extends Customer {
    private Order[] orders;

    @Override
    public String toString() {
        return "Customer [orders=" + Arrays.toString(orders)
          + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }
}

Vamos ver os resultados da chamada do métodotoString() acima:

@Test
public void givenArray_whenToString_thenCustomerDetails() {
    CustomerArrayToString customer = new CustomerArrayToString();
    // .. set up customer as before
    // .. set up order as before
    customer.setOrders(new Order[] { order });

    assertEquals("Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], " +
      "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString());
}

7. Wrappers, coleções eStringBuffers

Quando um objeto é composto inteiramente dewrappers,collections ouStringBuffers, nenhuma simplificaçãotoString() personalizada é necessária porque esses objetos já substituíram o métodotoString() com representações significativas:

public class CustomerWrapperCollectionToString extends Customer {
    private Integer score; // Wrapper class object
    private List orders; // Collection object
    private StringBuffer fullname; // StringBuffer object

    @Override
    public String toString() {
        return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname
          + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
    }
}

Vamos ver novamente os resultados de chamartoString():

@Test
public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() {
    CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString();
    // .. set up customer as before
    // .. set up orders as before
    customer.setOrders(new Order[] { order });

    StringBuffer fullname = new StringBuffer();
    fullname.append(customer.getLastName()+ ", " + customer.getFirstName());

    assertEquals("Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, "
      + "getLastName()=Bhojwani]", customer.toString());
}

8. Conclusão

Neste artigo, vimos como criar nossas próprias implementações do métodotoString() .

Todo o código-fonte deste artigo está disponívelover on GitHub.