Domanda

Oltre, ovviamente, al loro utilizzo con le primitive.La maggior parte (se non tutte) delle implementazioni che vedo sono utili solo dal punto di vista del programmatore.


MODIFICARE:Capisco che dovrei sovrascrivere il comportamento predefinito, ecco perché ho menzionato le implementazioni :).E ottengo il valore di sovrascriverlo in alcuni componenti che richiedono una rappresentazione String all'interno di una GUI.Tuttavia, almeno nel JDK, vedo molti di implementazioni che vengono utilizzate solo ogni volta che è necessario eseguire il debug delle istanze dell'oggetto.

Perché è radicato nella classe Object, dal momento che sembra utile solo per elementi di GUI/debug?ci sono altri usi di cui non sono a conoscenza?

È stato utile?

Soluzione

toString () è utile quando si vuole una rappresentazione di stringa di un oggetto. Naturalmente ciò accade per il debugging, ma può anche essere valido risultati di output delle operazioni per l'utente.

Per esempio, supponiamo di avere una classe Complex che gestisce i numeri complessi. Se si desidera stampare fuori ad un utente in un formato come 3 + 2i , è comodo se definiscono toString () in quanto non è necessario scrivere il formato di ogni tempo e l'uscita sarà coerente. Se vi capitasse di voler cambiare questa rappresentazione, ad esempio per 3 + 2 undecies , è solo bisogno di toccare il metodo toString () nella classe complesso.

toString () non è a scopo di debug anche, ma è un buon modo per ottenere rappresentazioni di stringa consistenti di oggetti.

Altri suggerimenti

No, la chiave è che si suppone di ignorare l'implementazione predefinita di ToString() per renderlo utile. ToString() può essere un ottimo modo per l'emissione del valore di qualcosa di nuovo per l'interfaccia utente.

Un semplice esempio potrebbe essere se si dispone di una classe di nome con un tre corde (primo, medio, ultimo). È possibile avere un metodo ToString() che formatta per l'interfaccia utente:. "Cognome, Nome Medio", per esempio

o di una classe che memorizza un'operazione matematica (valori sinistra = due, destra = 3, Risultato = 6 e un enum operatore = Moltiplica). Chiamata ToString() per ottenere "2 * 3 = 6".

Tuttavia , è probabilmente più comune per avere una varietà di metodi diversi To<qualifier>String(), come la classe .NET DateTime. (ToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

Modifica:. Per quanto riguarda il motivo per cui è radicata la classe Object, è semplicemente perché ToString() è un'operazione valida per niente |

Inoltre, le stringhe possono essere un buon modo di marshalling tra i tipi di dati o consumatori di dati, perché è (praticamente) garantito per essere analizzabile e non richiede codifica supplementare o una cura.

La mia preferenza personale è che toString () dovrebbe non essere usato per qualcosa di diverso di debug. Se si vuole produrre una stringa di un oggetto, di fornire un metodo separato che documenta chiaramente la vostra intenzione (getName (), getDescription (), ecc). Mai fare affidamento sulla realizzazione di un toString ().

Il problema è che molti sviluppatori vedono toString () come una stringa a livello di debug e non pensano niente di cambiarlo (per esempio quando i nuovi campi vengono aggiunti o rimossi). Heck, alcuni toString automatizzato () i costruttori utilizzano riflessione per generare un toString () dai campi.

Ho trovato questa preferenza mi ha servito bene nel corso degli anni.

Tutto quello che posso dire è che ho avuto pausa codice quando ho cambiato il toString della mia classe per visualizzare alcune informazioni di debug aggiuntive.

Il codice in questione era una libreria GUI che ha deciso di utilizzare il valore di toString come qualche cosa interna (si trattava di un paio di anni fa ... ho dimenticato cosa fosse esattamente). Il risultato finale è stato che non ho usato più quella libreria.

Direi che da quando un folto gruppo di persone vedono toString ad essere utilizzato per il debug (indipendentemente dalla vostra opinione di ciò che si pensa che dovrebbe essere utilizzato per) che è problematico di utilizzare il valore restituito da esso per fare nulla programmatico (come analizzarlo) o visualizzare a un utente.

Se siete 100% nel controllo dei metodi toString poi con tutti i mezzi fare quello che vuoi.

Quindi, per rispondere alla domanda, non toString non è solo utile per il debugging, si può fare tutto quello che vuoi con esso. Tuttavia, non stupitevi se i cambiamenti toString in modi che vi rendono infelici.

Nella mia esperienza, toString () ha poco valore al di fuori di debug e la registrazione. Non si può dipendere da esso è formato o il contenuto nel corso del tempo, così oltre ad essere leggibile, non dipendono da esso per altro che il più semplice degli oggetti (come ad esempio i tipi di oggetti primitivi). Se ci sono più membri di dati, si aspettano che possono cambiare nel tipo o il numero nel corso del tempo, e l'uscita del toString () con esso.

Un altro punto che vorrei fare con forza. Non chiamare gli altri metodi in toString (). Niente di peggio che la verifica dei contenuti variabili su un punto di interruzione nel debugger, e poi avere più codice eseguire a causa delle chiamate di metodo nel toString ().

Credo che sia importante sottolineare le persone che hanno risposto menzionando "toString" notare la minuscola "t" sono generalmente parlando di Java, e le persone che hanno risposto menzionando "ToString" sono generalmente riferisco a C #. Naturalmente, questo non si applica a tutte le risposte.

Nella mia osservazione (Io uso sia al giorno), i programmatori in C # sono incoraggiati a ignorare "ToString" per visualizzare una rappresentazione testuale utile. Considerando che, in Java, non vedo questo quasi tanto. In realtà, raramente vedo questo.

-JP

Prima il toString Il metodo dovrebbe restituire una rappresentazione testuale leggibile dell'oggetto.

Questo problema viene sollevato Java efficace COME Articolo 10:Sostituisci sempre toString.

Fa riferimento a Specifica dell'API Java per il Object.toString metodo:

Il risultato dovrebbe essere una rappresentazione concisa ma informativa che è facile da leggere per una persona.

A parte il debug, l'override di toString di una classe può essere utile quando si aggiungono oggetti in un file JList o a JTable, che per impostazione predefinita utilizzerà il file toString metodo per visualizzare l'oggetto come modulo testuale nell'elenco o nella tabella.

Ad esempio, nel mio caso, ho sovrascritto il file toString metodo degli oggetti che vengono aggiunti a a JList in modo che l'utente possa vedere le informazioni sull'elemento in un elenco tramite la GUI.

Quindi, ci sono effettivamente casi in cui il toString Il metodo è utile per casi diversi dal debug.La chiave è avere il toString metodo restituisce informazioni che sono effettivamente utili per una persona da vedere, non quelle predefinite Object.toString implementazione in cui la posizione di memoria dell'oggetto viene utilizzata per la sua rappresentazione testuale.

Utile per

  1. Gui (Proprietà complessa quando si utilizza PropertyGrid, Modulo di intestazione di testo)
  2. DataBinding (questo è il modo in cui si lavora)

E qualsiasi altra uscita stringa.

ToString () è anche chiamato da .NET Framework implicitamente quando si stampa qualsiasi oggetto fuori in una stringa.

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

è equivalente a

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

perché il ToString () viene chiamato implicitamente.

Io credo, anche se non sono sicuro, che è utilizzato dal debugger per il "valore" di un oggetto. Questo può essere abbastanza a portata di mano, anche se limitata. Nella maggior parte dei casi la scrittura del proprio visualizzatore debugger sarebbe un'idea migliore.

In AS3, ho dovuto convertire una matrice 2D in un array 1D. Il più veloce (velocità di corsa) e la soluzione più semplice (tempo di codifica) era:

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

essere sorpreso, ma in realtà è a lavorare come previsto e abbastanza veloce, anche!

Io uso ToString () una tonnellata per i formati datetime.

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

A parte ciò che chiunque altro ha già detto, ignorando ToString () è utile anche quando si utilizzano i controlli che chiamano. Ad esempio, un ComboBox:

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.

potrebbe non essere il "previsto" l'uso, ma l'ho usato per la serializzazione dei dati

storeToHardDrive(studentList.ToString());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top