10

もちろん、プリミティブでの使用に加えて。私が見る実装のほとんど(すべてではないにしても)は、プログラマーの観点からのみ有用です。


編集:私はデフォルトの動作をオーバーライドすることになっていることを理解しているので、実装について言及しました:)。そして、GUI内で文字列表現を必要とするいくつかのコンポーネントでそれをオーバーライドすることの価値を手に入れました。ただし、少なくともJDKでは、オブジェクトインスタンスをデバッグする必要がある場合にのみ使用されるようになる実装がたくさんあります。

それがGUI/デバッグのものにのみ役立つように見えるので、なぜそれはObjectクラスに根ざしているのですか?私が知らない他の用途はありますか?

4

13 に答える 13

17

いいえ、重要なのは、デフォルトの実装をオーバーライドしてToString()、それを便利にすることになっているということです。ToString()何かの値をUIに出力するための優れた方法になる可能性があります。

簡単な例は、3つの文字列(First、Middle、Last)を持つNameクラスがある場合です。UI用にフォーマットするToString()メソッドを作成できます。たとえば、「Last、FirstMiddle」などです。

または、数学演算を格納するクラス(値Left = 2、Right = 3、Result = 6、および演算子enum = Multiple)。ToString()「2*3=6」を取得するために呼び出します。

ただしTo<qualifier>String()、 .NETDateTimeクラスなど、さまざまな異なるメソッドを使用する方がおそらく一般的です。(ToShortDateString()、、、、... ToLongDateString()ToLongTimeString()

編集:それがクラスに根ざしている理由についてはObject、それは単にToString()に対しても有効な操作だからです。

さらに、文字列は(実際には)解析可能であることが保証されており、追加のエンコードや注意を必要としないため、データ型またはデータコンシューマー間でマーシャリングするための優れた方法になります。

于 2009-02-19T02:02:10.127 に答える
13

私の個人的な好みは、toString()をデバッグ以外の目的で使用してはならないということです。オブジェクトの文字列を生成する場合は、意図を明確に文書化する別のメソッド(getName()、getDescription()など)を提供します。toString()の実装に依存しないでください。

問題は、多くの開発者がtoString()をデバッグレベルの文字列と見なし、それを変更することを何も考えていないことです(たとえば、新しいフィールドが追加または削除されたとき)。自動化されたtoString()ビルダーの中には、リフレクションを使用してフィールドからtoString()を生成するものがあります。

私はこの好みが何年にもわたって私に役立っていることを発見しました。

于 2009-02-19T03:39:03.530 に答える
12

toString() は、オブジェクトの文字列表現が必要な場合に便利です。これは当然デバッグ目的で発生しますが、操作の結果をユーザーに出力する場合にも有効です。

たとえば、複素数を処理する Complex クラスがあるとします。3 + 2iのような形式でユーザーに出力したい場合は、 toString() を定義すると便利です。毎回形式を記述する必要がなく、出力が一貫しているからです。たとえば3 + 2jなど、その表現を変更したい場合は、Complex クラスの toString() メソッドに触れるだけです。

したがって、 toString() はデバッグ目的でもありませんが、オブジェクトの一貫した文字列表現を取得するための良い方法です。

于 2009-02-19T02:08:33.263 に答える
6

私が言えるのは、クラスのtoStringを変更して追加のデバッグ情報を表示したときに、コードが壊れたということだけです。

問題のコードは、toStringの値を内部的なものとして使用することを決定したGUIライブラリでした(数年前のことです...正確に何であったかを忘れています)。その結果、私はそのライブラリを使用しなくなりました。

大勢の人がtoStringをデバッグに使用していると見なしているため(どのように使用すべきかについての意見に関係なく)、toStringから返された値を使用してプログラムで何かを行うのは問題があります。 (解析のように)またはユーザーに表示します。

toStringメソッドを100%制御している場合は、必ず必要なことを実行してください。

したがって、質問に答えるために、toStringはデバッグに役立つだけでなく、好きなことを行うことができます。ただし、toStringが不幸になるような変更を加えても、驚かないでください。

于 2009-02-19T04:57:04.967 に答える
3

「toString」に言及して回答した人々は、小文字の「t」が一般的に Java について話していることに注意してください。もちろん、これはすべての回答に当てはまるわけではありません。

私自身の観察では (私は両方を毎日使用しています)、C# のプログラマーは "ToString" をオーバーライドして、有用なテキスト表現を表示することをお勧めします。一方、Java では、これはほとんど見られません。実際、私はこれをめったに見ません。

-JP

于 2009-02-19T20:41:52.180 に答える
2

まず、このtoStringメソッドは、人間が判読できるオブジェクトのテキスト表現を返す必要があります。

この問題は、Effective Java項目 10: Always overridetoStringとして取り上げられています。

メソッドのJava API 仕様を参照します。Object.toString

結果は、人が読みやすい簡潔で有益な表現になるはずです。

デバッグは別として、クラスのメソッドのオーバーライドは、オブジェクトをやtoStringに追加するときに役立ちます。デフォルトでは、メソッドを使用してオブジェクトをテキスト形式でリストまたはテーブルに表示します。JListJTabletoString

たとえば、私の場合、にtoString追加されたオブジェクトのメソッドをオーバーライドしJListて、ユーザーが GUI を介してリスト内の項目に関する情報を表示できるようにしました。

toStringですから、デバッグ以外でもメソッドが役立つケースは確かにあります。重要なのは、オブジェクトのメモリ位置がテキスト表現に使用されるtoStringデフォルトの実装ではなく、人が見るのに実際に役立つ情報をメソッドが返すようにすることです。Object.toString

于 2009-02-19T05:44:36.117 に答える
1

に便利

  1. Gui (PropertyGrid、フォーム ヘッダー テキストを使用する場合の複雑なプロパティ)
  2. DataBinding (それがどのように機能するか)

その他の文字列出力。

于 2009-02-19T02:18:49.353 に答える
0

他の誰もがすでに言ったこととは別に、ToString()をオーバーライドすることは、それを呼び出すコントロールを使用するときにも役立ちます。たとえば、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.
于 2009-02-19T04:11:14.687 に答える
0

ToString()は、オブジェクトを文字列に出力するときに、.NETFrameworkによって暗黙的に呼び出されます。

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

と同等です

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

ToString()が暗黙的に呼び出されるためです。

確かではありませんが、オブジェクトの「値」のためにデバッガーによって使用されると思います。制限はありますが、これはかなり便利です。ほとんどの場合、独自のデバッガビジュアライザを作成することをお勧めします。

于 2009-02-19T02:06:58.480 に答える
0

日時形式にはToString()を1トン使用します。

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

于 2009-02-19T04:03:38.073 に答える
0

AS3 では、2D 配列を 1D 配列に変換する必要がありました。最速 (実行速度) で最も簡単な (コーディング時間) ソリューションは次のとおりです。

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

驚くかもしれませんが、実際には意図したとおりに動作しており、非常に高速です。

于 2009-02-19T02:12:58.043 に答える
-1

「意図的な」使用ではないかもしれませんが、データのシリアル化に使用しました

storeToHardDrive(studentList.ToString());
于 2009-02-19T03:33:38.177 に答える