2011-08-11 2 views
3

J'ai trouvé le besoin d'utiliser String.format dans mon projet. Cependant, cela ne fonctionne pas dans GWT, et j'ai un remplacement qui utilise GWT RegExp. Cependant, je voudrais que mon projet s'exécute sans erreurs en utilisant l'interface normale de Swing qui ne dépend pas de GWT. Le code partagé dépend cependant de String.format. Le problème est que je ne sais pas comment faire que le compilateur GWT utilise une classe différente de l'autre code. J'ai déjà essayé de tout faire dans un fichier, mais cela ne fonctionne pas, car GWT ne peut pas gérer l'exception NoClassDefFoundError que j'utilise pour détecter quand GWT est absent de classpath.Substitution de classe lors de la compilation avec GWT

Voici mon code actuel:

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); 
    } 
    } 
} 

Comment puis-je faire cette compiler et exécuter sur GWT et GWT sans JRE en classpath? Ai-je vraiment besoin de faire en sorte que le script de construction Ant remplace le fichier entier par un script différent lors de la construction de GWT par rapport à Swing/Sun JRE?

+0

Vous dites que String.format "ne fonctionne pas dans GWT", quel est le problème? –

+0

Je reçois une erreur similaire à celle-ci: http://stackoverflow.com/questions/3126232/string-formatter-in-gwt –

Répondre

4

Une solution consiste à utiliser Deferred Binding Replacement:

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

Et puis appelez GWT.create(Util.class) dans votre code GWT. Pour éviter que le projet Swing ne prenne en charge la classe UtilGWT, je le placerais dans un dossier source différent (ou j'indiquerais à la tâche javac de Ant d'ignorer le fichier). Toutefois, cela ne vous permettra pas de réutiliser la partie du code qui appelle GWT.create() dans votre application Swing. Il faudrait donc créer une usine, ou appeler une initialisation au démarrage de l'application, ou quelque chose comme ça ... tous les problèmes habituels si vous vivez sans Dependency Injection.

Si vous voulez utiliser l'injection de dépendance (par exemple avec Guice/Gin), le processus de substituer une mise en œuvre devient très naturel: Créer une classe abstraite Util/interface et deux implémentations: UtilGWT et UtilJRE - puis mis en place la instance correcte dans votre module (vous auriez un module différent pour vos applications GWT et Swing), et vous obtenez automatiquement l'implémentation correcte partout où vous en avez besoin.

Questions connexes