1

プリミティブを文字列に変換する必要がある場合、たとえば文字列を期待するメソッドに渡す場合、基本的に 2 つのオプションがあります。

int例として使用すると、次のようになります。

int i;

次のいずれかを実行できます。

someStringMethod(Integer.toString(i));
someStringMethod(i + "");

最初のものは「正式な」アプローチであり、2番目のものはやや「ハック」のようです。

確かに、コードがはるかに少なくなり、「ハック」IMHOを読みやすくなります。
しかし、「ハック」を使用するのは「良い」コーディング スタイルですか?

4

4 に答える 4

4

*を文字列に変換する最良の方法は、次を使用することです。

String.valueOf(x)

を実装するプリミティブ型、ラッパークラス、およびオブジェクトで機能しますtoString()

ここで、xは任意の種類のプリミティブまたはオブジェクトです。nullの場合、文字列'null'を返します。

これが最適な理由は、「+」オペランドの使用は文字列の連結を意味し、「」は文字列のインスタンス化を意味するためです。"" +何かを使用してクラスを逆コンパイルすると、コンパイラがそれを複数の操作に変換するのがわかります。

""連結の結果はと同じString.valueOf()ですが、少し高価です。パフォーマンスの違いはおそらく無視できる程度ですが、優れたプログラマーは、より良い方法がある場合に、何かを文字列に変換するために'""+something'を記述しません。これはたまたま正しい方法です:)。

配列については、Arrays.toString()および-better- Arrays.deepToString( )をご覧ください。

しかし、「ハック」を使用するのは「良い」コーディングスタイルですか?

構文ハックによってコードが改善されることがあります。しかし、上記のケースは、実際にはそれらのケースの1つではありません。""連結は適切なコードとは見なされません。

便利な構文ハックの例は、二重中括弧のインスタンス化です。

List<String> list = new ArrayList<String>() {{
    add("foo");
    add("bar");
    add("baz");
}};

それ以外の

List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");

"" +何かは、読みやすさを向上させるハックというよりもコードの臭いです。ある程度の経験がある人なら誰でも、APIと言語の知識が不足しているJava開発者に思いを馳せるでしょう。

その他の興味深い「ハック」は、流暢なAPI(Mockitoなど)、dsl、またはlambda4jなどのハックです。

于 2012-12-25T01:27:50.617 に答える
4

それは良い考えではありませんが、それほど有害ではありません。

どちらの例Integer.toString()でも、JVM によって呼び出されています (最初のケースでは直接ではありませんが)。

2 番目の例では、JVM はおそらく 2 つの文字列を構築し、連結の結果を生成します。最適化に応じて、ガベージ コレクションに 0、1、または 2 個の余分な文字列が発生する可能性があります。

コード作成の観点からは、3 番目の方が短いですが、何が起こっているかについての透過性が低い可能性があります。

可読性における 2 番目のアプローチの問題点は次のとおりです。

int i = 1, j = 2;
someStringMethod(i + j + "" + i + j + "");

プロデュース:

someStringMethod(312);

ではない

someStringMethod(33);
于 2012-12-25T01:19:21.227 に答える
1

+記号を使用して文字列が形成される場合、jvmは変換を実行するための中間文字列/文字列バッファオブジェクトを作成しますが、これは最適な方法ではありません。また、+記号は結合性のままなので、 "" + 1 + 2のような式で使用すると、 "3"ではなく12になります。したがって、String.toValue()またはType.toString()を使用することをお勧めします。

于 2012-12-25T01:45:10.167 に答える
0

Java の連結記号は + です。したがって (i + "")、サンプルコードでは空の文字列を数値に連結するため、結果を文字列に変換します。
2つの方法は良いですが、私は通常使用しますString.valueOf(x);

于 2017-01-08T23:54:52.733 に答える