バックグラウンド
すべてのJavaオブジェクトにはtoString()
メソッドがあり、オブジェクトを印刷しようとすると呼び出されます。
System.out.println(myObject); // invokes myObject.toString()
このメソッドは、Object
クラス(すべてのJavaオブジェクトのスーパークラス)で定義されています。このObject.toString()
メソッドは、クラスの名前、@
シンボル、16進数のオブジェクトのハッシュコードで構成される、見苦しい文字列を返します。このコードは次のようになります。
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
com.foo.MyType@2f92e0f4
したがって、などの結果は次のように説明できます。
com.foo.MyType
-クラスの名前。つまり、クラスはMyType
パッケージ内にありますcom.foo
。
@
-文字列を結合します
2f92e0f4
オブジェクトのハッシュコード。
配列クラスの名前は少し異なります。これについては、Javadocでよく説明されていClass.getName()
ます。たとえば、次の[Ljava.lang.String
ことを意味します。
[
- (とは対照的に、単一次元アレイ[[
又は[[[
等)
L
-配列にはクラスまたはインターフェースが含まれます
java.lang.String
-配列内のオブジェクトのタイプ
出力のカスタマイズ
お電話の際は別の何かを印刷するにはSystem.out.println(myObject)
、あなたがしなければならないオーバーライドしtoString()
、独自のクラスのメソッドを。以下に簡単な例を示します。
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
これで、を印刷するとPerson
、ではなく名前が表示されcom.foo.Person@12345678
ます。
これtoString()
は、オブジェクトを文字列に変換する方法の1つにすぎないことに注意してください。通常、この出力では、オブジェクトを明確かつ簡潔に完全に説明する必要があります。toString()
私たちのPerson
クラスにとってより良いのは:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
これは、たとえばを印刷しますPerson[name=Henry]
。これは、デバッグ/テストに非常に役立つデータです。
オブジェクトの1つの側面のみに焦点を当てる場合、または多くのジャジーなフォーマットを含める場合は、代わりに別のメソッドを定義することをお勧めしますString toElegantReport() {...}
。
出力の自動生成
多くのIDEtoString()
は、クラスのフィールドに基づいてメソッドを自動生成するためのサポートを提供します。たとえば、EclipseおよびIntelliJのドキュメントを参照してください。
いくつかの人気のあるJavaライブラリもこの機能を提供しています。いくつかの例は次のとおりです。
オブジェクトのグループを印刷する
これtoString()
で、クラスに適したものが作成されました。そのクラスが配列またはコレクションに配置されるとどうなりますか?
配列
オブジェクトの配列がある場合は、を呼び出しArrays.toString()
て、配列の内容の単純な表現を生成できます。たとえば、次のPerson
オブジェクトの配列を考えてみます。
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
注:これは、Arraysクラスで呼び出される静的メソッドの呼び出しtoString()
であり、これまでに説明してきたものとは異なります。
あなたが持っている場合は多次元配列を、あなたが使用することができArrays.deepToString()
、出力の同じ種類を達成するために。
コレクション
ほとんどのコレクションは.toString()
、すべての要素の呼び出しに基づいてきれいな出力を生成します。
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
したがって、toString()
上記のようにリスト要素がnice を定義していることを確認する必要があるだけです。