23

GWT はすべての Java のコアをエミュレートしているわけではありませんが、代わりに使用できるものは次のとおりです。

String.format("The answer is - %d", 42)?

GWTでメッセージに引数を挿入するエレガントで効率的なパターンは何ですか?

4

7 に答える 7

17

洗練されたソリューションの 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も参照してください。

于 2013-03-16T19:10:38.237 に答える
7

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();
 }
于 2013-03-16T20:33:55.557 に答える
7

ほとんどの (99.999% のように) メッセージ形式は静的であり、コンパイル時に既知であるため、GWT がアプローチする方法は、コンパイル時にそれらを解析することです。

通常、メッセージをローカライズする機能のためにMessagesサブインターフェイスSafeHtmlTemplatesを使用しますが、必要になる場合もあります。

于 2013-03-16T23:01:52.553 に答える
0

自分で書くことができます。

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();
}
于 2014-07-18T13:49:48.210 に答える