プログラムの作成中に、オブジェクトの内容を調べる必要が生じることがよくあります。これらの目的のために、クラス階層内の最も基本的な Java クラスであるJavaオブジェクトクラスは、特別なtoString()メソッドを定義します。オブジェクトを説明する文字列を返します。Java の toString()メソッドのデフォルト実装では、次のような出力が生成されます。
package.class@hashCode
つまり、 java.lang.Objectで定義されたtoStringは、オブジェクトのハッシュ コードを 16 進形式で提供します。これは多くの場合、あまり明確ではなく、役に立ちません。したがって、新しいクラスを作成するときは、戻り文字列にクラス名、名前、すべての変数の値が含まれるようにtoString()をオーバーライドするのが通例です。toStringメソッドを正しくオーバーライドすると、Java プログラムのロギングとデバッグに役立ち、価値のある重要な情報が得られます。簡単に言えば、Java ではtoString()メソッドを使用して、数値オブジェクトの値を表す文字列オブジェクトを取得します。つまり、数値を文字列に変換します。メソッドが引数として単純なデータ型を取る場合、単純なデータ型の値を表す文字列オブジェクトが返されます。
Java toString() メソッドの例
通常、クラスを作成する場合、そのオブジェクトの操作方法を知るために、 Java のtoString()メソッドに加えて、equals メソッド、hashCodeメソッド、およびCompareToメソッドをオーバーライドする必要があります。ただし、今はtoStringに焦点を当てましょう。ほとんどの場合、オブジェクトに関するテキスト情報を送信するのは非常に簡単です。必要なのは、ユーザーがログ記録時に何を確認したいのかを正確に理解することだけです。例を示し、平面上の点を記述するクラスを作成してみましょう。座標 X と座標 Y の 2 つの座標があります。当然のことながら、クラス名と同じように、ユーザーが「これは何のオブジェクトですか」と尋ねた場合には画面に表示されるはずです。これは、オーバーライドされたtoString()メソッドで説明する内容です。次に、クラス自体、そのフィールド (座標)、コンストラクター、座標を取得するためのゲッターを作成します (もちろん、これらを作成しないことも可能ですが、OOP を正しく使用するという観点からは、ゲッターを使用することをお勧めします)。説明のために、新しいポイント (他の 2 つの合計) を作成し、equals メソッドとhashCodeメソッドをオーバーライドするメソッドも作成しましょう。public class Point implements Comparable<Point> {
private final int coordinateX;
private final int coordinateY;
public Point(final int coordinateX, final int coordinateY) {
this.coordinateX = coordinateX;
this.coordinateY = coordinateY;
}
public int getX() {
return coordinateX;
}
public int getY() {
return coordinateY;
}
public Point sum(final Point that) {
return new Point(coordinateX + that.coordinateX, coordinateY + that.coordinateY);
}
// here we override toString with coordinates and class name
@Override
public String toString() {
return "Point{"
+ "X: " + getX()
+ ", Y: " + getY()
+ '}';
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (o == null || o.getClass() != this.getClass()) {
return false;
}
@Override
public int hashCode() {
return coordinateX + coordinateY;
}
次に、テスト クラスと main メソッドを作成しましょう。ここで 2 ポイントが得られ、3 番目のポイントは 2 ポイントの合計から得られます。この点にtoStringメソッドを適用して出力します。
//toString() method demo
public class Test {
public static void main(String[] args) {
Point myPoint1 = new Point(5,7);
Point myPoint2 = new Point(-2, 8);
Point mySum = myPoint1.sum(myPoint2);
//call toString explicitly
System.out.println(mySum.toString());
}
}
このプログラムの作業結果は次のとおりです。
点{X: 3, Y: 15}
実際には、 toStringメソッドを 明示的に呼び出す必要はありませんし、ほとんどの場合は呼び出す必要はありません。toString()メソッドを呼び出すには、目的のオブジェクトをSystem.out.printlnに渡すだけです。したがって、テストクラスは次のようになります。
//toString method demo
public class Test {
public static void main(String[] args) {
Point myPoint1 = new Point(5,7);
Point myPoint2 = new Point(-2, 8);
Point mySum = myPoint1.sum(myPoint2);
//call toString implicitly
System.out.println(mySum);
}
}
プログラムの出力は以前と同じです。toStringメソッドをオーバーライドせずに、オブジェクトを出力したい場合はどうすればよいでしょうか? この場合、ObjectクラスのtoStringメソッドが呼び出されます。この例では、PointクラスからtoStringメソッドを削除し、すべてをテスト クラスにそのまま残すと、次の結果が得られます。
ポイント@12
ここでは、オブジェクトのハッシュ コードを 16 進数で取得しています。