GWT はすべての Java のコアをエミュレートしているわけではありませんが、代わりに使用できるものは次のとおりです。
String.format("The answer is - %d", 42)?
GWTでメッセージに引数を挿入するエレガントで効率的なパターンは何ですか?
GWT はすべての Java のコアをエミュレートしているわけではありませんが、代わりに使用できるものは次のとおりです。
String.format("The answer is - %d", 42)?
GWTでメッセージに引数を挿入するエレガントで効率的なパターンは何ですか?
洗練されたソリューションの 1 つは、SafeHtml テンプレートを使用することです。次のようなインターフェイスで複数のそのようなテンプレートを定義できます。
public interface MyTemplates extends SafeHtmlTemplates {
@Template("The answer is - {0}")
SafeHtml answer(int value);
@Template("...")
...
}
そして、それらを使用します:
public static final MyTemplates TEMPLATES = GWT.create(MyTemplates.class);
...
Label label = new Label(TEMPLATES.answer(42));
これはセットアップに少し手間がかかりますが、引数が自動的に HTML エスケープされるという大きな利点があります。詳細については、https://developers.google.com/web-toolkit/doc/latest/DevGuideSecuritySafeHtmlを参照してください。
さらに一歩進んでメッセージを国際化したい場合は、https://developers.google.com/web-toolkit/doc/latest/DevGuideI18nMessages#SafeHtmlMessagesも参照してください。
format function
ブレインストームを行う代わりに、自分で書くことができます。
public static String format(final String format, final String... args,String delimiter) {
String[] split = format.split(delimiter);//in your case "%d" as delimeter
final StringBuffer buffer= new StringBuffer();
for (int i= 0; i< split.length - 1; i+= 1) {
buffer.append(split[i]);
buffer.append(args[i]);
}
buffer.append(split[split.length - 1]);
return buffer.toString();
}
ほとんどの (99.999% のように) メッセージ形式は静的であり、コンパイル時に既知であるため、GWT がアプローチする方法は、コンパイル時にそれらを解析することです。
通常、メッセージをローカライズする機能のためにMessages
サブインターフェイスSafeHtmlTemplates
を使用しますが、必要になる場合もあります。
自分で書くことができます。
Strings(%s) だけで動作するバージョンを書きました:
public static String format(final String format, final Object... args)
{
checkNotNull(format);
checkNotNull(args);
final String pattern = "%s";
int start = 0, last = 0, argsIndex = 0;
final StringBuilder result = new StringBuilder();
while ((start = format.indexOf(pattern, last)) != -1)
{
if (args.length <= argsIndex)
{
throw new IllegalArgumentException("There is more replace patterns than arguments!");
}
result.append(format.substring(last, start));
result.append(args[argsIndex++]);
last = start + pattern.length();
}
if (args.length > argsIndex)
{
throw new IllegalArgumentException("There is more arguments than replace patterns!");
}
result.append(format.substring(last));
return result.toString();
}