10

私はToString()過去に適度に使用してきましたが、多くの状況で非常に便利であることがわかりました. ただし、このメソッドの私の使用法は、このメソッドをSystem.Object. 私の勝手な推測では、.NET フレームワークの初期設計を考え出すために実行された作業と開催された会議のある時点で、次のようなToString()メソッドを含める必要がある、または少なくとも非常に有用であると判断されたのです。 .NET フレームワークのすべてによって実装されます。

正確な理由を知っている人はいますか?ToString()の一部になるのに十分有用であることが証明されている多くの状況を見逃していSystem.Objectますか? 元の理由はToString()何ですか?

どうもありがとう!

PS - 繰り返しますが、私はメソッドに疑問を呈したり、役に立たないことを暗示しているわけではありませんSystem.Object

補足 - これを想像してみてください:

AnyDotNetNativeClass someInitialObject = new AnyDotNetNativeClass([some constructor parameters]);

AnyDotNetNativeClass initialObjectFullCopy = AnyDotNetNativeClass.FromString(someInitialObject.ToString());

これはかっこいいと思いませんか?

編集(1):

(A) - いくつかの回答に基づいて、.NET 言語はこれを Java から継承したようです。そのため、件名とタグにも「Java」を追加しています。これがJavaで実装された理由を誰かが知っている場合は、光を当ててください!

(B) - 静的仮説FromStringvs シリアライゼーション: 確かに、それはまったく別の話ですよね?

4

4 に答える 4

14

最初は、デバッグとロギングの目的で Object に追加されました。Object.toString の JavaDoc ( http://java.sun.com/javase/6/docs/api/java/lang/Object.html#toString() )を見ると、これを推測できます。 classname の後に @ が続き、その後にオブジェクトのハッシュ コードの符号なし 16 進数表現が続きます。これが非常に便利であることを確認できる唯一の場所は、ログまたはコンソールです。

しかし、Java の作成者は意図的にこのメソッドを非 final のままにしておいたので、サブクラスはそれをオーバーライドして、代わりにサブクラス固有の情報をより多く出力することができます (また、オーバーライドする必要があります)。文字列を必要とする任意のメソッドにオブジェクトを渡すように JVM を実装するだけで、上記のハッシュ値を生成してメソッドに渡すこともできましたが、代わりに、彼らは素晴らしく、非常に便利なメソッドとして実装しました。オーバーライド。

また、オブジェクト レベルで実装されているため、任意のオブジェクトをログ/コンソールに書き出すことができると安全に想定できます。これは、Java 言語での便利な仮定です。

于 2010-02-22T00:04:33.123 に答える
6

そのメリットについて議論することはありませんが、これは C# のインスピレーションを与える言語である Java に根ざしていると思います。(両方の言語で) 作成された理由は、さまざまなカルチャのサポートを含め、任意のオブジェクトのインスタンスの文字列表現を取得する方法を提供することでした。そのような単純な。

于 2010-02-21T23:27:58.237 に答える
2

toString()onを定義する技術的な理由は 2 つ考えられますjava.lang.Object

  • API (PrintStream.print(Object)たとえば)はに依存しObject.toString()ます。

  • String 連結演算子は、オペランドの 1 つが非 String 参照型である場合に+依存します。Object.toString()

別の方法として、のようなメソッドを提供し、上記Printableで. (そして、初心者がオーバーロードしないオブジェクトを印刷しようとしたときに発生する困惑を回避できます)。 toString()PrintabletoString()

printただし、 (etc) と+連結がすべてに対して機能するのは本当に便利です。Java がそのように設計されたのはそのためだと確信しています。

編集- OPからのこのフォローアップの質問への回答:

静的な仮説の FromString とシリアライゼーション: 確かに、それはまったく別の話ですよね?

あなたの構文を正しく解析していると仮定すると...

オブジェクトのシリアル化の目標は、確実かつ効率的に逆シリアル化できるフラットな表現を提供することです。toString() の目的は、読みやすいテキスト表現を提供することです。実際には、「読みやすい」ことと「確実かつ効率的にデシリアライズできる」ことは矛盾しています。

于 2010-02-22T00:58:15.343 に答える
1

デバッグ目的のみであれば、任意のオブジェクトが文字列表現を持つことができると便利だと考えられていたと思います...

于 2010-02-21T23:52:43.163 に答える