1. 概要

Javaのすべてのクラスは、直接または間接的にObjectクラスの子です。 また、 ObjectクラスにはtoString()メソッドが含まれているため、任意のインスタンスで toString()を呼び出して、その文字列表現を取得できます。

このチュートリアルでは、toString()ののデフォルトの動作を確認し、その動作を変更する方法を学習します。

2. デフォルトの動作

オブジェクト参照を出力するときはいつでも、 toString()メソッドを内部的に呼び出します。 したがって、クラスで toString()メソッドを定義しない場合、 Object# toString()が呼び出されます。

オブジェクトのtoString()メソッドはかなり一般的です。

public String toString() {
    return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

これがどのように機能するかを確認するために、チュートリアル全体で使用するCustomerオブジェクトを作成しましょう。

public class Customer {
    private String firstName;
    private String lastName;
    // standard getters and setters. No toString() implementation
}

ここで、 C ustomer オブジェクトを印刷しようとすると、 Object toString()が呼び出され、出力は次のようになります。に似ている:

com.baeldung.tostring.Customer@6d06d69c

3. デフォルトの動作をオーバーライドする

上記の出力を見ると、Customerオブジェクトの内容に関する情報があまり得られていないことがわかります。 一般に、オブジェクトのハッシュコードではなく、オブジェクトの属性の内容を知ることに関心があります。

toString()メソッドのデフォルトの動作をオーバーライドすることで、メソッド呼び出しの出力をより意味のあるものにすることができます。

次に、オブジェクトを使用していくつかの異なるシナリオを見て、このデフォルトの動作をオーバーライドする方法を見てみましょう。

4. プリミティブ型と文字列

Customer オブジェクトには、String属性とプリミティブ属性の両方があります。 より意味のある出力を実現するには、 toString()メソッドをオーバーライドする必要があります。

public class CustomerPrimitiveToString extends Customer {
    private long balance;

    @Override
    public String toString() {
        return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }
}

toString()を呼び出したときに何が得られるか見てみましょう。

@Test
public void givenPrimitive_whenToString_thenCustomerDetails() {
    CustomerPrimitiveToString customer = new CustomerPrimitiveToString();
    customer.setFirstName("Rajesh");
    customer.setLastName("Bhojwani");
    customer.setBalance(110);
    assertEquals("Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]", 
      customer.toString());
}

5. 複雑なJavaオブジェクト

ここで、 お客様オブジェクトには、 注文タイプの属性注文。 私たちの注文クラスには両方がありますおよびプリミティブデータ型フィールド。

それでは、 toString()を再度オーバーライドしてみましょう。

public class CustomerComplexObjectToString extends Customer {
    private Order order;
    //standard setters and getters
    
    @Override
    public String toString() {
        return "Customer [order=" + order + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }      
}

以来注文複雑なオブジェクトです 印刷するだけならお客様オブジェクト、オーバーライドせずに toString() 私たちの方法注文クラス、それは印刷されます注文なので注文@

これを修正するには、 OrdertoString()もオーバーライドします。

public class Order {
    
    private String orderId;
    private String desc;
    private long value;
    private String status;
 
    @Override
    public String toString() {
        return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]";
    }
}

ここで、 order属性を含むCustomerオブジェクトでtoString()メソッドを呼び出すとどうなるか見てみましょう。

@Test
public void givenComplex_whenToString_thenCustomerDetails() {
    CustomerComplexObjectToString customer = new CustomerComplexObjectToString();    
    // .. set up customer as before
    Order order = new Order();
    order.setOrderId("A1111");
    order.setDesc("Game");
    order.setStatus("In-Shiping");
    customer.setOrders(order);
        
    assertEquals("Customer [order=Order [orderId=A1111, desc=Game, value=0], " +
      "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString());
}

6. オブジェクトの配列

次に、私たちを変えましょうお客様の配列を持つ注文 s印刷するだけならお客様オブジェクト、特別な処理なし注文オブジェクト、それは印刷されます注文なので注文;@

これを修正するには、ordersフィールドにArrays.toString()を使用します。

public class CustomerArrayToString  extends Customer {
    private Order[] orders;

    @Override
    public String toString() {
        return "Customer [orders=" + Arrays.toString(orders) 
          + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }    
}

上記のtoString()メソッドを呼び出した結果を見てみましょう。

@Test
public void givenArray_whenToString_thenCustomerDetails() {
    CustomerArrayToString customer = new CustomerArrayToString();
    // .. set up customer as before
    // .. set up order as before
    customer.setOrders(new Order[] { order });         
    
    assertEquals("Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], " +
      "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString());
}

7. ラッパー、コレクション、および StringBuffers

オブジェクトが完全にラッパーコレクション、または StringBuffers で構成されている場合、これらのオブジェクトのため、カスタム toString()実装は必要ありません。 toString()メソッドを意味のある表現ですでにオーバーライドしています。

public class CustomerWrapperCollectionToString extends Customer {
    private Integer score; // Wrapper class object
    private List<String> orders; // Collection object
    private StringBuffer fullname; // StringBuffer object
  
    @Override
    public String toString() {
        return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname
          + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
    }
}

toString()を呼び出した結果をもう一度見てみましょう。

@Test
public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() {
    CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString();
    // .. set up customer as before
    // .. set up orders as before 
    customer.setOrders(new Order[] { order }); 
    
    StringBuffer fullname = new StringBuffer();
    fullname.append(customer.getLastName()+ ", " + customer.getFirstName());
    
    assertEquals("Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, "
      + "getLastName()=Bhojwani]", customer.toString());
}

8. 結論

この記事では、 toString()メソッドの独自の実装を作成する方法について説明しました。

この記事のすべてのソースコードは、GitHubから入手できます。