Beste Praxis der Verwendung von Flaggen in der Java-Methode
Was ist die best practice für die Angabe von flags, die in einer Java-Methode?
Ich habe gesehen, SWT mit int als bitfields, wie:
(Beispiel teilweise aus "Effective Java, 2nd Ed.", Seite 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) {
}
}
client-Aufruf sieht wie folgt aus:
printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);
..aber dies wird abgeraten, da Sie gemischt-flags (int-Werte) aus unterschiedlichen Klassen zusammen, ohne compiler überprüft.
Im gleichen Buch ("Effective Java"), sehe ich die Verwendung von EnumSet, aber dann ist dein user nennen wird:
printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));
Ich finde das ein wenig ausführlich und ich bevorzuge die Eleganz der SWT.
Gibt es eine andere alternative oder ist dies im Grunde die zwei Geschmacksrichtungen, die Sie Holen müssen?
- Ich denke du meinst
STYLE_ITALIC = 1 << 1
. - Ich denke, das ist eine großartige demonstration von einem gemeinsamen problem mit den bit-Feld-Ansatz!
- Ja, in der Tat es ist. 🙂
- Danke @VictorZamanian ich aktualisierte die Frage
- Was findest du "ausführliche" über das zweite? Es ist ein einzelnes Zeichen mehr. Was findest du "elegant" über den ersten? Alle es tut, ist werfen Art Sicherheit aus - es gibt nichts eleganter über, die.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vermute, Sie haben eine Wand schlagen. Ich sehe keine andere option. Java ist ausführlich, das ist eine Tatsache. In Situationen wie dieser, die ich in der Regel fügen Sie eine lokale variable, um den code lesbarer zu gestalten. Sie können dies tun,
Wenn Sie möchten, bit-Stil-flags, Java hüllt Sie in einen
BitSet
. Es ist schon seit Ewigkeiten, aber nur wenige Leute die Mühe, es zu benutzen (lieber Einbettung von C-Stil-bit-handling in int-Werte).Die api für BitSet finden Sie hier.
Gepaart mit ein paar gut gewählten statischen int-Werte, es tut ziemlich gut, bis Sie beginnen immer in Kontrolle und setzen von mehreren bits in einem Durchgang.
Ich Ihnen raten, gehen Sie mit der
EnumSet
Ansatz.Dieser Ansatz bietet bessere Sicherheit, und
Style
ein enum haben ausgewachsene OO-Fähigkeiten.Späten Antwort für jeden, kommen über diese. Hier ist ein Weg, es zu tun zu reduzieren Gedächtnis und haben eine schöne enum wie api:
Methode:
nennen:
Wenn Sie nur eine begrenzte Anzahl von Methoden, die einen Satz von Formatvorlagen (wie
printText
, in Ihrem Beispiel), Sie können zwicken Ihre Unterschrift nehmen eine variable Anzahl von Stil params:Werden und dann die Anrufe sind sehr nah an der untypisierte (int) flag route:
Leider gibt es keine
EnumSet.of(E... )
Fabrik, nurEnumSet.of(E first, E... more)
, so müssen Sie einen generischenlogicalOr
Methode split das array in die erste + rest Brocken. Links als übung für den Leser =).