ほとんどのコア ライブラリと Java クラスでは、すべての Java 実装で「toString」表現が標準になっています。または、これはJava仕様で指定されていません。
たとえば、 new HashMap()/toString は、IBM jrockit と同じであると予想される OpenJDK からの出力です。
それらは互換性があるべきですか?ある JVM から別の JVM にコードを移植していて、文字列表現が同じであると予想される場合は、問題になる可能性があります。
メソッドの出力toString()
は (いくつかの例外を除いて) 指定されていないため、理論的には Java の実装ごとに異なる可能性があります。
ただし、ほとんどの商用Java 実装には、Sun / Oracle クラス ライブラリの一部のバージョン (OpenJDK コードベースまたはそれ以前のもの) から派生したクラス ライブラリがあります。Sun / Oracle が顧客のコードを破壊する可能性のある変更を意図的に行うことに慎重であることを考えると、それぞれの方法はほとんど互換性があると予想されます。toString()
ただし、注目すべき例外がいくつかあります。たとえば、GNU Classpath ライブラリ、Apache Harvest ライブラリ、および ... Android に基づく Java 実装。これらの実装は Java コンプライアンス テストに合格しないことに注意してください (オラクルは、受け入れ可能な条件で TDK のライセンスを供与することを拒否しているためです!!) 厳密に言えば、Java(tm) と呼ぶことはできません。
肝心なのは、文書化され toString()
ていないフォーマットに依存すると、移植の問題や JVM バージョンのアップグレード時に問題が発生する可能性があるということです。しかし実際には、問題が発生する可能性は、移植元と移植先によって大きく異なります。Oracle / Sun 派生クラス ライブラリを使用する JVM に固執する場合、問題が発生する可能性はほとんどありません。
それで、あなたはこれについて何をすべきですか?
最も極端な立場はtoString
、出力形式が指定されている場合を除いて、(暗黙的または明示的に) メソッドの使用を避けることです。しかし、それは行き過ぎだと思います。(そして、このポリシーを強制するのは難しいかもしれません...)
より現実的な立場はtoString
、正確な出力形式が重要な場合にメソッドを使用しないことです。言い換えると:
toString()
形式が指定されていない限り、オブジェクトのシリアル化スキームでは使用しないでください。
単体テストで使用する場合toString()
は、移植作業の一環として、移植性のない単体テストを修正する必要がある場合があることに注意してください。
良い質問です。それは実装に依存します。正式な仕様はありません。http://www.amazon.com/The-Java-Class-Libraries-Volume/dp/0201310023のような本は、図書館が何をするかを明確に特定していますが、必ずしも「すべき」とは限りません。
したがって、実装者は表示内容を自由に選択して文書化できますtoString()
が、表示が他のJVM実装間で同じであることを保証するものではありません。
問題を解決するために、toString()
実装を確実にする唯一の@Override
public String toString()
方法は、派生クラスでメソッドを作成し(はい、必要な各クラスを派生させる必要がありtoString()
ます)、その出力を明示的に指定することです。
[toString()メソッドの]文字列出力が同じであると期待しないでください。メソッドの内容と形式は指定されていません(関連するjavaDocを参照してください)。
同じベンダーの異なるバージョンの実装が同じであるという保証はありません。したがって、インスタンスを結果で比較しtoString()
たり、それらの結果をデータベースまたは一般的な識別子のキーとして使用したりしないでください。これらは、インスタンスの単なるテキスト表現です。これ以上何もない。
JLSは次のように述べています。
1.4。定義済みのクラスおよびインターフェイスとの関係
前述のように、この仕様は Java SE プラットフォーム API のクラスを参照することがよくあります。特に、一部のクラスは Java プログラミング言語と特別な関係にあります。例には、Object、Class、ClassLoader、String、Thread などのクラス、およびパッケージ java.lang.reflect 内のクラスとインターフェースなどが含まれます。この仕様は、そのようなクラスとインターフェイスの動作を制限しますが、完全な仕様を提供するものではありません。読者は、Java SE プラットフォームの API ドキュメントを参照してください。
だから...いいえ、あなたが記述することを要求する仕様はありません。