Java toString()メソッド

1. 概要

Javaのすべてのクラスは、直接的または間接的に_Object_クラスの子です。 また、_Object_クラスには__toString()__methodが含まれているため、任意のインスタンスで_toString()_を呼び出して、その文字列表現を取得できます。
このチュートリアルでは、** _String()_のデフォルトの動作を見て、その動作を変更する方法を学びます。**

2. デフォルトの動作

オブジェクト参照を出力するたびに、_toString()_メソッドを内部的に呼び出します。 したがって、クラスで_toString()_メソッドを定義しない場合、_Object#toString()_が呼び出されます。
_Object's_ _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
}
_Customer_オブジェクトを印刷しようとすると、_Object _#_ toString()_が呼び出され、出力は次のようになります。
[email protected]

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

上記の出力を見ると、_Customer_オブジェクトのコンテンツに関する多くの情報が得られていないことがわかります。 *一般に、オブジェクトのハッシュコードではなく、オブジェクトの属性の内容を知ることに興味があります。*
__toString()__methodのデフォルトの動作をオーバーライドすることにより、メソッド呼び出しの出力をより意味のあるものにすることができます。
それでは、オブジェクトを使用したいくつかの異なるシナリオを見て、このデフォルトの動作をオーバーライドする方法を見てみましょう。

4. プリミティブ型と_Strings_

_Customer_オブジェクトには、_String_属性とプリミティブ属性の両方があります。 より意味のある出力を得るには、_toString()_メソッドをオーバーライドする必要があります。
public class CustomerPrimitiveToString extends Customer {
    private long balance;

    @Override
    public String toString() {
        return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName()
          + ", getLastName()=" + getLastName() + "]";
    }
}
__toString()__nowを呼び出したときに得られるものを見てみましょう。
@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オブジェクト

ここで、_Customer_オブジェクトに、Order_Order型の__order __attributeも含まれるシナリオを考えてみましょう。
それでは、_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() + "]";
    }
}
  • Order_クラスは複雑なオブジェクトであるため、_Order_クラスのtoString()methodをオーバーライドせずに_Customer_オブジェクトを印刷するだけであるため、_orders as link:/ cdn-cgi / l / email-protection [[email protected ]] <ハッシュコード> . *

    これを修正するには、_Order_の_toString()_もオーバーライドしましょう:
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 ___attributeを含む_Customer_オブジェクトで__toString()__methodを呼び出すとどうなるか見てみましょう。
@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. オブジェクトの配列

次に、__ Customer___を__Order__s _._の配列に変更します。_orders_オブジェクトを特別に処理せずに、_Customer_オブジェクトを印刷する場合、_orders_ as _Order; @ <hashcode> _を印刷します。
これを修正するには、_orders_フィールドに__https://www.baeldung.com/java-array-to-string [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_

オブジェクトが完全にlink:/java-wrapper-classes[wrappers]、link:/java-collections[collections]、またはhttps:// wwwで構成されている場合.baeldung.com / java-collections [__ StringBuffer__s]、これらのオブジェクトはすでに_toString()_メソッドを意味のある表現でオーバーライドしているため、カスタム__toString()__implementationは必要ありません。
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()__methodの独自の実装の作成を検討しました。
この記事のすべてのソースコードは、https://github.com/eugenp/tutorials/tree/master/java-strings-ops [GitHubで]から入手できます。