298

Printf は 1.5 リリースで Java に追加されましたが、出力をファイルではなく文字列に送信する方法を見つけることができないようです (これは sprintf が C で行うことです)。誰もこれを行う方法を知っていますか?

4

5 に答える 5

504
// Store the formatted string in 'result'
String result = String.format("%4d", i * j);

// Write the result to standard output
System.out.println( result );

形式とその構文を参照してください

于 2008-09-05T23:06:53.820 に答える
28

文字列は不変の型です。それらを変更することはできません。新しい文字列インスタンスを返すだけです。

そのため、次のように呼び出す必要があるため、インスタンス メソッドを使用したフォーマットはほとんど意味がありません。

String formatted = "%s: %s".format(key, value);

オリジナルの Java 作成者 (および .NET 作成者) は、ターゲットを変更するのではなく、フォーマット メソッドを呼び出して入力文字列を渡すため、この状況では静的メソッドの方が理にかなっていると判断しました。

format()これは、インスタンスメソッドとして馬鹿げている理由の例です。.NET (およびおそらく Java) ではReplace()、インスタンス メソッドです。

あなたはこれを行うことができます:

 "I Like Wine".Replace("Wine","Beer");

ただし、文字列は不変であるため、何も起こりません。Replace()新しい文字列を返そうとしますが、何も割り当てられていません。

これにより、次のような多くの一般的な初心者の間違いが発生します。

inputText.Replace(" ", "%20");

繰り返しますが、何も起こりません。代わりに、次のことを行う必要があります。

inputText = inputText.Replace(" ","%20");

文字列が不変であることを理解していれば、それは完全に理にかなっています。そうでない場合は、混乱しているだけです。の適切な場所は、次の静的メソッドとしてReplace()where is になります。format()String

 inputText = String.Replace(inputText, " ", "%20");

今、何が起こっているのか疑問の余地はありません。

本当の問題は、これらのフレームワークの作成者が、一方をインスタンス メソッドにし、もう一方を静的にすべきだと判断したのはなぜかということです。私の意見では、どちらも静的メソッドとしてよりエレガントに表現されています。

あなたの意見に関係なく、真実は、静的バージョンを使用すると間違いを犯す可能性が低くなり、コードが理解しやすくなることです (隠れた落とし穴はありません)。

もちろん、インスタンスメソッドとして完璧なメソッドがいくつかあります.String.Length()を取ります

int length = "123".Length();

この状況では、"123" を変更しようとしているのではないことは明らかです。単にそれを調べて、その長さを返しているだけです。これは、インスタンス メソッドの完全な候補です。

不変オブジェクトのインスタンス メソッドに関する私の単純なルール:

  • 同じ型の新しいインスタンスを返す必要がある場合は、静的メソッドを使用してください。
  • それ以外の場合は、インスタンス メソッドを使用します。
于 2008-10-13T17:34:00.413 に答える