たとえば、Java独自のString.format()
は、可変数の引数をサポートしています。
String.format("Hello %s! ABC %d!", "World", 123);
//=> Hello World! ABC 123!
可変数の引数を受け入れる独自の関数を作成するにはどうすればよいですか?
フォローアップの質問:
私は本当に便利なショートカットを作成しようとしています:
System.out.println( String.format("...", a, b, c) );
そのため、次のような冗長性の低いものと呼ぶことができます。
print("...", a, b, c);
どうすればこれを達成できますか?
便利なメソッドを書くことができます:
public PrintStream print(String format, Object... arguments) {
return System.out.format(format, arguments);
}
しかし、ご覧のとおり、単にformat
(またはprintf
)という名前に変更しました。
使用方法は次のとおりです。
private void printScores(Player... players) {
for (int i = 0; i < players.length; ++i) {
Player player = players[i];
String name = player.getName();
int score = player.getScore();
// Print name and score followed by a newline
System.out.format("%s: %d%n", name, score);
}
}
// Print a single player, 3 players, and all players
printScores(player1);
System.out.println();
printScores(player2, player3, player4);
System.out.println();
printScores(playersArray);
// Output
Abe: 11
Bob: 22
Cal: 33
Dan: 44
Abe: 11
Bob: 22
Cal: 33
Dan: 44
同様に動作する同様のSystem.out.printf
メソッドもありますが、実装を覗くと、printf
がformat
を呼び出すだけなので、format
を直接使用することもできます。 。
これは可変引数として知られています- here のリンクを参照してください
過去のJavaリリースでは、任意の数の値をとるメソッドでは、メソッドを呼び出す前に配列を作成し、値を配列に入れる必要がありました。たとえば、MessageFormatクラスを使用してメッセージをフォーマットする方法は次のとおりです。
Object[] arguments = {
new Integer(7),
new Date(),
"a disturbance in the Force"
};
String result = MessageFormat.format(
"At {1,time} on {1,date}, there was {2} on planet "
+ "{0,number,integer}.", arguments);
複数の引数を配列で渡す必要があることは依然として事実ですが、可変引数機能はプロセスを自動化して非表示にします。さらに、既存のAPIとの上位互換性があります。したがって、たとえば、MessageFormat.formatメソッドには次の宣言があります。
public static String format(String pattern,
Object... arguments);
varargs のJavaガイドをご覧ください。
以下に示すようにメソッドを作成できます。 System.out.printf
の代わりにSystem.out.println(String.format(...
を呼び出すだけです。
public static void print(String format, Object... args) {
System.out.printf(format, args);
}
または、できるだけ少なく入力する場合は、 static import を使用するだけです。次に、独自のメソッドを作成する必要はありません。
import static Java.lang.System.out;
out.printf("Numer of apples: %d", 10);
これは、上記の回答に対する単なる拡張です。
here と使用するルール可変引数を明確に説明しました。
以下は、文字列型の引数の可変長セットを作成します。
print(String arg1, String... arg2)
その後、arg2
を文字列の配列として参照できます。これはJava 5の新機能です。
変数の引数は、関数宣言で指定された最後のパラメーターでなければなりません。変数引数の後に別のパラメータを指定しようとすると、実際に変数引数に属するパラメータの数を判断する方法がないため、コンパイラは文句を言います。
void print(final String format, final String... arguments) {
System.out.format( format, arguments );
}