Pergunta

Além, é claro, o seu uso com primitivos. A maioria (se não todas) das implementações que eu vejo só são úteis do ponto de vista do programador.


Editar : Eu entendo que eu deveria substituir o comportamento padrão, é por isso que eu mencionei implementações :). E eu faço obter o valor de substituindo-lo em alguns componentes que necessitam de uma representação de String dentro de uma GUI. No entanto, no JDK, pelo menos, vejo muitos de implementações que só vêm para usar sempre que precisar para depurar as instâncias de objetos.

Por que é enraizada na classe Object, uma vez que é só parece útil para GUI / depuração coisas? Existem outros usos não estou ciente de?

Foi útil?

Solução

toString () é útil quando quiser uma representação de cadeia de um objeto. Naturalmente que acontece para fins de depuração, mas também pode ser válido para os resultados das operações para o usuário de saída.

Por exemplo, digamos que você tem uma classe complexa que lida com números complexos. Se você quiser imprimi-los para um usuário em um formato como 3 + 2i , é útil se eles definem toString () que você não tem que escrever o formato de todos os tempos e a saída será consistente. Se você quiser mudar essa representação, por exemplo, para 3 + 2j , você só precisa tocar o método toString () na classe Complex.

Assim toString () não é para fins de depuração também, mas é uma boa maneira de obter representações de seqüência consistentes de seus objetos.

Outras dicas

Não, a chave é que você deveria substituir a implementação padrão de ToString() para torná-lo útil. ToString() pode ser uma ótima maneira de saída o valor de algo de volta para a interface do usuário.

Um exemplo simples seria se você tem uma classe nome com um três cordas (Primeiro, Média, Last). Você pode ter um método ToString() que formata para a interface do usuário:. "Sobrenome, Oriente", por exemplo

Ou uma classe que armazena uma operação matemática (valores para a esquerda = 2, Direita = 3, Resultado = 6 e um enum operador = Multiply). ToString() chamada para obter "2 * 3 = 6".

No entanto , é provavelmente mais comum ter uma variedade de diferentes métodos To<qualifier>String(), como a classe .NET DateTime. (ToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

Edit: Quanto à razão que está enraizada na classe Object, é simplesmente porque ToString() é uma operação válida para qualquer

.

Além disso, cordas pode ser uma boa maneira de empacotamento entre tipos de dados ou consumidores de dados, porque é (praticamente) a garantia de ser analisável e não requer codificação extra ou cuidado.

A minha preferência pessoal é que toString () deve não ser usado para outra coisa senão a depuração. Se você quiser produzir uma string para um objeto, fornecer um método separado que documenta claramente a sua intenção (getName (), getDescription (), etc). Nunca confie na implementação de um toString ().

O problema é que muitos desenvolvedores ver toString () como uma seqüência de nível de depuração e acho que nada de mudá-lo (dizer quando novos campos são adicionados ou removidos). Heck, alguns toString automatizado () construtores usar o reflexo para gerar um toString () dos campos.

Eu encontrei essa preferência tem me servido bem ao longo dos anos.

Tudo o que posso dizer é que eu tive quebra de código quando eu mudei o toString da minha classe para exibir algumas informações de depuração adicional.

O código em questão era uma biblioteca GUI que decidiu usar o valor de toString como algo interno (que era um par de anos atrás ... Eu esqueço o que era exatamente). O resultado final foi que eu não uso essa biblioteca mais.

Eu diria que uma vez que um grande grupo de pessoas ver toString como sendo usado para depurar (independentemente da sua opinião sobre o que você acha que deveria ser usado para) que é problemático para fazer uso do valor retornado a partir dele para fazer programático nada (como analisá-lo) ou exibi-lo a um usuário.

Se você está 100% no controle dos métodos toString, em seguida, por todos os meios fazer o que quiser.

Assim, para responder à pergunta, não toString não só é útil para depuração, você pode fazer o que quiser com ele. No entanto, não se surpreenda se toString muda de forma que o fazem infeliz.

Na minha experiência, toString () tem pouco valor fora de depuração e exploração madeireira. Você não pode depender de formato é OR conteúdo ao longo do tempo, de modo que além de ser legível, não dependem dele para outra coisa senão o mais simples dos objetos (como os tipos de objetos primitivos). Se houver vários membros de dados, esperamos que eles podem mudar no tipo ou número ao longo do tempo, e a saída do toString () junto com ele.

Outro ponto que eu gostaria de fazer fortemente. Não chamar outros métodos em sua toString (). Nada pior do que verificar o conteúdo de variáveis ??em um ponto de interrupção no depurador, e depois ter mais de código executar por causa de chamadas de método no toString ().

Eu acho que é importante destacar as pessoas que responderam mencionar "toString" aviso a minúsculas "t" são geralmente falando de Java, e as pessoas que responderam mencionar "ToString" são geralmente referindo-se a C #. Claro, isso não se aplica a todas as respostas.

Na minha própria observação (eu uso tanto por dia), os programadores em C # são encorajados a substituir "ToString" para exibir uma representação textual útil. Considerando que, em Java, eu não vejo isso quase tanto quanto. Na verdade, eu raramente vejo isso.

-JP

Em primeiro lugar, o método toString deve retornar uma representação textual legível do objeto.

Esta questão é levantada em Effective Java como Item 10 :. sempre override toString

Ele faz referência a Java API Specification para o Object.toString método:

O resultado deve ser um conciso, mas representação informativo que é fácil para uma pessoa para ler.

Além de depuração, substituindo o método toString de uma classe pode ser útil quando ading objetos em uma JList ou um JTable , que por padrão usará o método toString para exibir o objeto como uma forma textual na lista ou tabela.

Por exemplo, no meu caso, eu tenho substituído o método toString de objetos que são adicionados a um JList para que o usuário será capaz de ver informações sobre o item em uma lista através do GUI.

Assim, há certamente casos em que o método toString é útil para outros fins que depuração casos. A chave é ter a informação método toString retorno que é realmente útil para uma pessoa ver, não a implementação Object.toString padrão onde local de memória do objeto é utilizado para a sua representação textual.

Útil para

  1. Gui (Propriedade complexo quando você usa PropertyGrid, Form texto do cabeçalho)
  2. DataBinding (que é a maneira como ele trabalha)

E qualquer outra saída string.

ToString () também é chamado pelo .NET Framework implicitamente ao imprimir qualquer objeto para uma string.

Console.WriteLine("My Object is" + object.ToString());

é equivalente a

Console.WriteLine("My Object is" + object);

porque o ToString () é chamado implicitamente.

Eu acredito que, embora não tenho certeza, que é usado pelo depurador para o "valor" de um objeto. Isso pode ser bastante útil, embora limitada. Na maioria dos casos escrever o seu próprio visualizador depurador seria uma idéia melhor.

Em AS3, eu tinha que converter uma matriz 2D em uma matriz 1D. O (velocidade de execução) mais rápida e mais fácil solução (tempo de codificação) foi:

var new1DArray:Array = the2DArray.toString().split(",");

Ser surpreendido, mas é realmente funcionando como esperado e bastante rápido, também!

Eu uso ToString () uma tonelada de data e hora formatos.

http://hunterconcepts.com/content/tools/formats/

Além de que todo mundo já disse, substituindo ToString () também é útil ao usar controles que chamá-lo. Por exemplo, uma caixa de combinação:

myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.

não pode ser o "destina-se" uso mas eu usei-o para serialização de dados

storeToHardDrive(studentList.ToString());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top