fundo
Todos os objetos Java possuem um toString()
método que é chamado quando você tenta imprimir o objeto.
System.out.println(myObject); // invokes myObject.toString()
Este método é definido na Object
classe (a superclasse de todos os objetos Java). O Object.toString()
método retorna uma string de aparência bastante feia, composta pelo nome da classe, um @
símbolo e o código de hash do objeto em hexadecimal. O código para isso se parece com:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Um resultado como o com.foo.MyType@2f92e0f4
pode, portanto, ser explicado como:
com.foo.MyType
- o nome da classe, ou seja, a classe está MyType
no pacote com.foo
.
@
- une a corda
2f92e0f4
o código hash do objeto.
O nome das classes de matriz parece um pouco diferente, o que é explicado nos Javadocs Class.getName()
. Por exemplo, [Ljava.lang.String
significa:
[
- uma matriz unidimensional (em oposição a [[
ou [[[
etc.)
L
- a matriz contém uma classe ou interface
java.lang.String
- o tipo de objetos na matriz
Personalizando a saída
Para imprimir algo diferente ao ligar System.out.println(myObject)
, você deve substituir o toString()
método em sua própria classe. Aqui está um exemplo simples:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Agora, se imprimirmos um Person
, veremos o nome deles em vez de com.foo.Person@12345678
.
Lembre-se de que toString()
é apenas uma maneira de um objeto ser convertido em uma string. Normalmente, essa saída deve descrever completamente seu objeto de maneira clara e concisa. Um melhor toString()
para a nossa Person
classe pode ser:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
O que imprimiria, por exemplo Person[name=Henry]
,. Esse é um dado realmente útil para depuração / teste.
Se você deseja focar apenas um aspecto do seu objeto ou incluir muita formatação jazzística, talvez seja melhor definir um método separado, por exemplo String toElegantReport() {...}
.
Geração automática da saída
Muitos IDEs oferecem suporte para gerar automaticamente um toString()
método, com base nos campos da classe. Consulte os documentos para Eclipse e IntelliJ , por exemplo.
Várias bibliotecas Java populares oferecem esse recurso também. Alguns exemplos incluem:
Imprimir grupos de objetos
Então você criou um ótimo toString()
para sua classe. O que acontece se essa classe é colocada em uma matriz ou coleção?
Matrizes
Se você tiver uma matriz de objetos, poderá chamar Arrays.toString()
para produzir uma representação simples do conteúdo da matriz. Por exemplo, considere esta matriz de Person
objetos:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Nota: esta é uma chamada para um método estático chamado toString()
na classe Arrays, que é diferente do que discutimos acima.
Se você tiver uma matriz multidimensional , poderá usar Arrays.deepToString()
para obter o mesmo tipo de saída.
Colecções
A maioria das coleções produzirá uma saída bonita com base na chamada .toString()
de cada elemento.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Então, você só precisa garantir que os elementos da sua lista definam um bom toString()
como discutido acima.