Подставляя класс при компиляции с GWT - PullRequest
3 голосов
/ 11 августа 2011

Я обнаружил необходимость использовать String.format в моем проекте. Тем не менее, это не работает в GWT, и у меня есть замена, которая использует GWT RegExp. Однако я хотел бы, чтобы мой проект работал без ошибок при использовании обычного интерфейса Swing, который не зависит от GWT. Общий код зависит от String.format, хотя. Проблема в том, что я не знаю, как заставить компилятор GWT использовать другой класс, чем другой код. Я уже пытался сделать все это в одном файле, но он не работает, так как GWT не может обработать исключение NoClassDefFoundError, которое я использую, чтобы определить, когда GWT отсутствует в classpath.

Вот мой текущий код:

package testpackage.shared;

import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.regexp.shared.SplitResult;

public class Util {

  public static String format(final String format, final Object... args) {
    try {
      final RegExp regex = RegExp.compile("%[a-z]");
      final SplitResult split = regex.split(format);
      final StringBuffer msg = new StringBuffer();
      for (int pos = 0; pos < split.length() - 1; pos += 1) {
        msg.append(split.get(pos));
        msg.append(args[pos].toString());
      }
      msg.append(split.get(split.length() - 1));
      return msg.toString();
    } catch (NoClassDefFoundError ex)  {
      return String.format(format, args);
    }
  }
}

Как мне сделать этот компилятор и запустить на GWT и JRE без GWT в classpath? Действительно ли нужно, чтобы скрипт сборки Ant заменял весь файл другим файлом при сборке для GWT по сравнению с Swing / Sun JRE?

1 Ответ

4 голосов
/ 11 августа 2011

Одним из решений является использование Замена отложенного связывания :

<replace-with class="testpackage.shared.UtilGWT">
  <when-type-is class="testpackage.shared.Util"/>
</replace-with>

А затем позвоните GWT.create(Util.class) в своем коде GWT. Чтобы проект Swing не собирал класс UtilGWT, я бы поместил его в другую исходную папку (или, возможно, поручил задаче javac Ant игнорировать файл).

Однако это по-прежнему не позволит вам повторно использовать часть кода, которая вызывает GWT.create() в вашем приложении Swing. Так что вам придется создать фабрику, или вызвать некоторую инициализацию при запуске приложения, или что-то в этом роде ... все обычные проблемы, если вы живете без Dependency Injection .

Если вы хотите использовать Dependency Injection (например, с Guice / Gin ), весь процесс замены реализации становится очень естественным: создайте абстрактный класс / интерфейс Util и две реализации: UtilGWT и UtilJRE - затем настройте правильный экземпляр в своем модуле (у вас будет другой модуль для ваших приложений GWT и Swing), и вы автоматически получите правильную реализацию везде, где вам это нужно.

...