Eu tenho uma classe definida da seguinte maneira:
public class Person {
private String name;
// constructor and getter/setter omitted
}
Eu tentei imprimir uma instância da minha classe:
System.out.println(myPerson);
mas eu tenho o seguinte resultado: com.foo.Person@2f92e0f4
.
Uma coisa semelhante aconteceu quando tentei imprimir uma matriz de Person
objetos:
Person[] people = //...
System.out.println(people);
Eu obtive a saída: [Lcom.foo.Person;@28a418fc
O que essa saída significa? Como altero essa saída para que ela contenha o nome da minha pessoa? E como imprimo coleções de meus objetos?
Nota : este é um questionário canônico sobre este assunto.
Respostas:
fundo
Todos os objetos Java possuem um
toString()
método que é chamado quando você tenta imprimir o objeto.Este método é definido na
Object
classe (a superclasse de todos os objetos Java). OObject.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: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 pacotecom.foo
.@
- une a corda2f92e0f4
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 interfacejava.lang.String
- o tipo de objetos na matrizPersonalizando a saída
Para imprimir algo diferente ao ligar
System.out.println(myObject)
, você deve substituir otoString()
método em sua própria classe. Aqui está um exemplo simples:Agora, se imprimirmos um
Person
, veremos o nome deles em vez decom.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 melhortoString()
para a nossaPerson
classe pode ser: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:
ToStringBuilder
de Apache Commons LangMoreObjects.ToStringHelper
do Google Guava@ToString
anotação do Projeto LombokImprimir 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 dePerson
objetos: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.Então, você só precisa garantir que os elementos da sua lista definam um bom
toString()
como discutido acima.fonte
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
e realmente, em vez dename
ele deve usar o gettergetName()
(mas getters foram omitidos na classe Pessoa ...) mas se foi utilizado um getter ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
para que você possa usá-lo também para matrizes de primitivos (int[]
,double[]
). TambémArrays.deepToString()
lida bem com matrizes multidimensionais de primitivas.Eu acho que o apache fornece uma classe util melhor, que fornece uma função para obter a string
fonte
Cada classe em Java possui o
toString()
método por padrão, que é chamado se você passar algum objeto dessa classe paraSystem.out.println()
. Por padrão, essa chamada retorna o className @ hashcode desse objeto.Você pode substituir o método toString de uma classe para obter uma saída diferente. Veja este exemplo
fonte
[Lcom.foo.Person;@28a418fc
como saída: essa também é a saída dotoString()
método, mas é aquela implementada na classe que é gerada em tempo de execução para o tipoPerson[]
, nãoPerson
(consulte stackoverflow.com/a/8546532/1542343 ).No Eclipse, Vá para a sua turma, Clique com o botão direito do mouse em-> fonte-> Gerar
toString()
;Ele substituirá o
toString()
método e imprimirá o objeto dessa classe.fonte
Prefiro usar uma função de utilitário que usa o GSON para desserializar o objeto Java na cadeia JSON.
fonte
return Gson.toJson(object);
, caso contrário, funcionaria perfeitamente.Em intellij, você pode gerar automaticamente o método toString pressionando alt + inset e, em seguida, selecionando toString () aqui está uma saída para uma classe de teste:
Como você pode ver, ele gera uma String concatenando vários atributos da classe, para primitivas imprime seus valores e para tipos de referência, usa seu tipo de classe (neste caso, para string do método Test2).
fonte
Por padrão, todo objeto em Java possui o
toString()
método que gera o ObjectType @ HashCode.Se você quiser informações mais significativas, precisará substituir o
toString()
método em sua classe.Agora, quando você imprimir o objeto da pessoa,
System.out.prtinln(personObj);
ele imprimirá o nome da pessoa em vez do nome da classe e do código de hash.No segundo caso, quando você está tentando imprimir a matriz, ela imprime
[Lcom.foo.Person;@28a418fc
o tipo de matriz e seu código de hash.Se você deseja imprimir os nomes das pessoas, existem várias maneiras.
Você pode escrever sua própria função que itera cada pessoa e imprime
Você pode imprimi-lo usando Arrays.toString (). Isso parece o mais simples para mim.
Você pode imprimi-lo da maneira java 8 (usando fluxos e referência de método).
Pode haver outras maneiras também. Espero que isto ajude. :)
fonte
Se você imprimir diretamente qualquer objeto de Pessoa, será
ClassName@HashCode
o código.no seu caso
com.foo.Person@2f92e0f4
está sendo impresso. OndePerson
é uma classe à qual o objeto pertence e2f92e0f4
é hashCode do objeto.Agora, se você tentar usar o objeto
Person
, ele imprimirá o nomefonte
Se você observar a classe Object (classe pai de todas as classes em Java), a implementação do método toString () será
sempre que você imprimir qualquer objeto em Java, toString () será chamado. Agora depende de você, se você substituir toString (), seu método chamará outra chamada de método da classe Object.
fonte