2010-07-07 3 views
4

Je suis en train de refactoriser une application de bureau Java existante pour charger des étiquettes de texte d'interface utilisateur internationalisées à partir d'un fichier .properties. Quand dans le cycle de vie de l'application est le moment approprié pour charger le fichier de propriétés et remplir les chaînes en mémoire? L'implémentation existante définit l'étiquette de chaque composant comme par exemple: public static final String foo = "bar"; Il semble inefficace de charger le texte dans le constructeur (puisqu'il sera partagé entre toutes les instances), mais tout faire dans un bloc static {...} ne semble pas non plus sain d'esprit. Quelle est la meilleure pratique ici? Dans la plupart des applications que j'ai vuSwing I18N: Quand charger les propriétés?

Répondre

6

, les propriétés sont chargées à partir d'un fichier avant de commencer à construire l'interface utilisateur principale. Ces propriétés sont chargées dans un ResourceBundle qui sera soit

  • statique
  • donné comme argument à chaque constructeur
2

Je suggère aux ressources de charge paresseusement. Fondamentalement, créez une fonction pour obtenir votre groupe de ressources qui le charge s'il n'est pas encore là. Ensuite, utilisez-le pour récupérer vos ressources.

3

Une autre façon de le faire, sans changer le code de panneaux, est d'utiliser une sorte de « injection de ressources ».

Les bibliothèques suivantes effectuent, entre autres choses:

  • fuse: exactement ce que fait (mais je ne testé et le projet semble mort maintenant)
  • Swing Application Framework: fait beaucoup de choses, y compris des ressources injection. Peut-être vaut une vérification au code source pour prendre ce qui est pertinent pour vous. Notez que le projet est mort, et le code source est assez salissante (peut-être pas facile à extraire code)
  • Guts-GUI: est un cadre d'interface graphique complète, y compris l'injection de ressources, mais il est basé sur Guice. Si vous connaissez un peu Guice, le code source de l'injection de ressources doit être facile à comprendre et à extraire du projet.

Dans la plupart des cas, l'injection de ressources est basée sur le nom donné à chaque composante (ce qui est la façon dont App Swing cadre et le travail Guts-GUI, pour Fuse Je ne suis pas sûr). Si les composants ne sont pas nommés correctement, vous avez également quelques options pour les nommer automatiquement (sans changer le code source des panneaux). J'ai mis en place une telle approche dans un paquet Guts-GUI, vous pouvez également vouloir jeter un coup d'oeil. Ensuite, l'injection de ressources est normalement appelée juste avant l'affichage de votre image ou de votre boîte de dialogue (ce sera le seul emplacement de code à modifier dans votre source actuelle, facile si le code d'ouverture des dialogues/trames est centralisé dans une classe). pas répandre tout autour).

2

J'opterais pour un chargement paresseux. Lorsque vous chargez tout à l'avance, vous augmentez simplement le temps de démarrage de l'application et vous risquez même de charger des tâches qui ne sont même plus nécessaires (plus).

Cette chose statique, vous avez mentionné, par ailleurs, mettrait fin en chargement paresseux de toute façon, puisque la machine virtuelle Java ne chargement paresseux pour les classes.Aussi: lorsque vous utilisez ResourceBundles, gardez à l'esprit qu'ils font une mise en mémoire cache interne, définissant ainsi un

public static final String labelText= "hello world"; 

ou, pire, initialisant d'un ResourceBundle est plutôt inutile.

plus lire:

A method for handling I18N in Java