9
votes

Meilleure pratique d'utiliser des drapeaux dans la méthode Java

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:

(Exemple partiellement à partir de "Java efficace de" Java efficace, 2ème éd. "Page 159): xxx

et votre appel client ressemble à: xxx

.. mais cela est découragé comme vous pouvez vous mélanger Drapeaux (Valeurs Int) de différentes classes ensemble sans chèques de compilateur.

Dans le même livre ("efficace Java"), je vois l'utilisation de Enumset, mais votre appel d'utilisateur devient alors: xxx

Je trouve cela un peu verbeux et je préfère l'élégance de SWT.

y a-t-il une autre alternative ou est-ce essentiellement les deux goûts que vous devez choisir ?


4 commentaires

Je pense que vous voulez dire style_italic = 1 << 1 .


@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.


5 Réponses :


8
votes

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


0 commentaires


2
votes

Je conseille que vous alliez avec l'approche Enumset . xxx

Cette approche offre une meilleure sécurité de type, et style étant un énumé aura des capacités oo pleine soufflé.


0 commentaires

1
votes

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: xxx

méthode: xxx

appel: xxx


3 commentaires

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)



0
votes

Si vous n'avez qu'un nombre limité de méthodes qui prendront un ensemble de styles (comme printText , dans votre exemple), vous pouvez modifier leur signature pour prendre un nombre variable de paramètres de style: xxx

et ensuite vos appels sont très proches de la route de drapeau non typée (int): xxx

Malheureusement, il n'y a pas de Enumset.of (E ...) usine, juste Enumset.of (E Premier, E ... plus) , vous aurez donc besoin d'un générique Méthode pour diviser votre tableau en premier + des morceaux de repos. laissé comme un exercice au lecteur =) .


0 commentaires