Quelle est la meilleure pratique pour spécifier des drapeaux dans une méthode Java?
J'ai vu SWT à l'aide d'int comme bitfields, comme: p>
(Exemple partiellement à partir de "Java efficace de" Java efficace, 2ème éd. "Page 159): p> et votre appel client ressemble à: p> .. mais cela est découragé comme vous pouvez vous mélanger Drapeaux (Valeurs Int) de différentes classes ensemble sans chèques de compilateur. P> Dans le même livre ("efficace Java"), je vois l'utilisation de Enumset, mais votre appel d'utilisateur devient alors: p> Je trouve cela un peu verbeux et je préfère l'élégance de SWT. P> y a-t-il une autre alternative ou est-ce essentiellement les deux goûts que vous devez choisir ? strong> p> p>
5 Réponses :
Je suppose que vous avez frappé un mur. Je ne vois aucune autre option. Java est verbeux c'est un fait. Dans des situations comme celle-ci, j'aime habituellement une variable locale pour rendre le code plus lisible. Vous pouvez le faire,
EnumSet<Style> styles = EnumSet.of(Style.Bold, Style.ITALIC); printText("hello", styles);
Si vous voulez des drapeaux de style de bit, Java les enveloppe dans un Bitset code>. Il y a été autour depuis des siècles, mais peu de gens se préoccupent de l'utiliser (préférant l'intégration de la manipulation de bits de style C dans les INT). P>
Oui, j'ai utilisé Bitset pour les drapeaux de l'examen final de l'une de mes classes le dernier semestre. C'était une solution élégante qu'aucun autre étudiant n'utilisait et mon professeur l'a vraiment aimé. :) J'encouragerais les gens à utiliser plus de Bitset, il ne semble pas être utilisé beaucoup.
Je conseille que vous alliez avec l'approche Cette approche offre une meilleure sécurité de type, et Enumset code>.
style code> étant un énumé aura des capacités oo pleine soufflé. P> P>
Réponse tardive pour quiconque qui traverse cela. Voici une façon de le faire pour réduire la mémoire et avoir une belle énumible comme API: méthode: p> appel: p>
Comment réduisez-vous exactement la mémoire?
En utilisant uniquement une seule variable INT pour stocker plusieurs drapeaux (via l'utilisation de bitmasks), plutôt qu'une variable séparée pour chaque drapeau
Sauf que vous avez maintenant n objets supplémentaires en mémoire (les instances MyFLAG)
Si vous n'avez qu'un nombre limité de méthodes qui prendront un ensemble de styles (comme et ensuite vos appels sont très proches de la route de drapeau non typée (int): p> Malheureusement, il n'y a pas de printText code>, dans votre exemple), vous pouvez modifier leur signature pour prendre un nombre variable de paramètres de style:
Enumset.of (E ...) Code> usine, juste
Enumset.of (E Premier, E ... plus) CODE>, vous aurez donc besoin d'un
générique Code> Méthode pour diviser votre tableau en premier + des morceaux de repos. laissé comme un exercice au lecteur =) em>. p> p>
Je pense que vous voulez dire
style_italic = 1 << 1 code>.
@Victor, je pense que c'est une grande démonstration d'un problème commun avec l'approche de terrain!
Merci@victorzamanian j'ai mis à jour la question
Que trouvez-vous "Verbose" sur le second? C'est un seul caractère plus longtemps. Que trouvez-vous "élégant" sur le premier? Tout ce qu'il fait, c'est une sécurité de type de jet - il n'y a rien d'élégant à ce sujet.