1. 序章

この記事では、文字列のキャストとtoString()メソッドの実行の違いについて簡単に説明します。 両方の構文を簡単に確認し、それぞれを使用する目的を説明する例を示します。 最後に、どちらがより良いアプローチであるかを見ていきます。

2. String型キャストとtoString()メソッド

簡単に要約することから始めましょう。 (String)構文の使用は、Javaでの型キャストと厳密に関連しています。 つまり、この構文を使用する主なタスクは、ソース変数を String:キャストすることです。

String str = (String) object;

ご存知のように、Javaのすべてのクラスは、 toString()メソッドを実装するObjectクラスの直接または間接の拡張です。 これを使用して、任意のオブジェクトの文字列表現を取得します

String str = object.toString();

簡単な要約を作成したので、各アプローチをいつ使用するかを理解するのに役立ついくつかの例を見ていきましょう。

3. (String) vs toString()

Object 変数があり、Stringを取得したいとします。 どの構文を使用する必要がありますか?

先に進む前に、次のユーティリティメソッドはトピックの説明にのみ使用されることを強調する必要があります。 実際には、このようなユーティリティメソッドは使用しません。

まず、ObjectStringにキャストする簡単なユーティリティメソッドを紹介します。

public static String castToString(Object object) {
    if (object instanceof String) {
        return (String) object;
    }
    return null;
}

ご覧のとおり、キャストする前に、オブジェクト変数がStringのインスタンスであることを確認する必要があります。 そうしないと、失敗してClassCastExceptionが生成される可能性があります。

@Test(expected = ClassCastException.class)
public void givenIntegerObject_whenCastToObjectAndString_thenCastClassException() {
    Integer input = 1234;

    Object obj = input;
    String str = (String) obj;
}

ただし、この操作はnullセーフです。 以前にString変数に適用されていなくても、インスタンス化されていない変数で使用すると成功します。

@Test
public void givenNullInteger_whenCastToObjectAndString_thenSameAndNoException() {
    Integer input = null;

    Object obj = input;
    String str = (String) obj;

    assertEquals(obj, str);
    assertEquals(str, input);
    assertSame(input, str);
}

次に、要求されたオブジェクトに対して toString()を呼び出す別のユーティリティ関数を実装します。

public static String getStringRepresentation(Object object) {
    if (object != null) {
        return object.toString();
    }
    return null;
}

この場合、オブジェクトのタイプを知る必要はなく、型キャストなしでオブジェクトに対して正常に実行できます。 単純なnullチェックを追加するだけです。 このチェックを追加しないと、インスタンス化されていない変数をメソッドに渡すときにNullPointerExceptionが発生する可能性があります。

@Test(expected = NullPointerException.class)
public void givenNullInteger_whenToString_thenNullPointerException() {
    Integer input = null;

    String str = input.toString();
}

さらに、コアの String 実装により、 String変数でtoString()メソッドを実行すると、同じオブジェクトが返されます。

@Test
public void givenString_whenToString_thenSame() {
    String str = "baeldung";

    assertEquals("baeldung", str.toString());
    assertSame(str, str.toString());
}

質問に戻りましょう–オブジェクト変数でどの構文を使用する必要がありますか? 上で見たように、変数がStringインスタンスであることがわかっている場合は、型キャストを使用する必要があります。

@Test
public void givenString_whenCastToObject_thenCastToStringReturnsSame() {
    String input = "baeldung";
    
    Object obj = input;
    
    assertSame(input, StringCastUtils.castToString(obj));
}

このアプローチは、追加の関数呼び出しを実行する必要がないため、一般的に効率的かつ迅速です。 ただし、StringObjectとして渡してはならないことを忘れないでください。 これは、コードの臭いがあることを示唆しています。

他のオブジェクトタイプを渡すときは、toString()メソッドを明示的に呼び出す必要があります に従って、String値を返すことを覚えておくことが重要です。実装:

@Test
public void givenIntegerNotNull_whenCastToObject_thenGetToStringReturnsString() {
    Integer input = 1234;

    Object obj = input;

    assertEquals("1234", StringCastUtils.getStringRepresentation(obj));
    assertNotSame("1234", StringCastUtils.getStringRepresentation(obj));
}

4. 結論

この短いチュートリアルでは、 String 型キャストと、 toString()メソッドを使用した文字列表現の取得という2つのアプローチを比較しました。 例を通して、違いを説明し、( String)または toString()をいつ使用するかを検討しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。