Les meilleures pratiques de l'utilisation de drapeaux dans la méthode Java
Quelle est la meilleure pratique pour la spécification des indicateurs dans une méthode en Java?
J'ai vu SWT l'aide d'int comme bitfields, comme:
(exemple partiellement de "Effective Java, 2nd Ed." page 159):
public class Text {
public static final int STYLE_BOLD = 1 << 0; //1
public static final int STYLE_ITALIC = 1 << 1; //2
void printText(String text, int flags) {
}
}
et votre client appel ressemble:
printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);
..mais c'est pas recommandée, car vous pouvez mixtes drapeaux (int valeur) de différentes classes d'ensemble sans compilateur vérifie.
Dans le même livre ("Effective Java"), je vois l'utilisation de EnumSet, mais alors votre appel utilisateur devient:
printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));
Je trouve cela un peu verbeux et je préfère l'élégance de SWT.
Est-il une autre solution ou est-ce fondamentalement, les deux saveurs que vous devez choisir?
Je pense que tu veux dire
Je pense que c'est une grande démonstration d'un problème commun avec le champ de bits approche!
Oui en effet il est. 🙂
Merci @VictorZamanian j'ai mis à jour la question
Que trouvez-vous de "commentaires" sur le second? C'est un seul caractère plus longtemps. Que trouvez-vous de "élégant" à propos de la première? Tout ce qu'il fait est de jeter un type de la sécurité - il n'y a rien d'élégant.
STYLE_ITALIC = 1 << 1
.Je pense que c'est une grande démonstration d'un problème commun avec le champ de bits approche!
Oui en effet il est. 🙂
Merci @VictorZamanian j'ai mis à jour la question
Que trouvez-vous de "commentaires" sur le second? C'est un seul caractère plus longtemps. Que trouvez-vous de "élégant" à propos de la première? Tout ce qu'il fait est de jeter un type de la sécurité - il n'y a rien d'élégant.
OriginalL'auteur Roalt | 2011-05-20
Vous devez vous connecter pour publier un commentaire.
Suppose que vous avez frappé un mur. Je ne vois pas d'autre option. Java est verbeux c'est un fait. Dans des situations comme cela, j'ai l'habitude d'ajouter une variable locale pour rendre le code plus lisible. Vous pouvez le faire,
OriginalL'auteur Aravindan R
Si vous voulez bits indicateurs de style, Java les enveloppe dans un
BitSet
. Il a été autour depuis des siècles, mais peu de personnes prennent la peine de l'utiliser (préférant l'incorporation de C bit de style de manutention dans ints).L'api pour BitSet peuvent être trouvés ici.
Couplé avec un peu bien choisi statique ints, il fait très bien jusqu'à ce que vous commencer à entrer dans la vérification et le réglage des bits multiples en un seul passage.
OriginalL'auteur Edwin Buck
Je vous informe que vous allez avec le
EnumSet
approche.Cette approche fournit une meilleure sécurité de type, et
Style
être un enum aura de plein fouet l'OO capacités.OriginalL'auteur missingfaktor
Réponse tardive pour ceux qui viennent sur cette. Voici une façon de faire pour réduire la mémoire et avoir une belle enum comme api:
méthode:
appel:
OriginalL'auteur bertvanbrakel
Si vous avez seulement un nombre limité de méthodes qui seront en prenant un ensemble de styles (comme
printText
, dans votre exemple), vous pouvez modifier leur signature à prendre un nombre variable de Style params:Et puis vos appels sont très proches de la non typé (int) drapeau de la route:
Malheureusement, il n'y a pas de
EnumSet.of(E... )
usine, justeEnumSet.of(E first, E... more)
, de sorte que vous aurez besoin d'un génériquelogicalOr
méthode de diviser un tableau en premier + reste des morceaux. Laissé comme exercice au lecteur =).OriginalL'auteur John Hart