Bewährte Methode zur Verwendung von Flags in der Java-Methode

8

Was ist die beste Vorgehensweise zum Angeben von Flags in einer Java-Methode?

Ich habe gesehen, dass SWT Int als Bitfelder verwendet, wie:

(Beispiel teilweise von "Effective Java, 2. Ausgabe" Seite 159):

%Vor%

und Ihr Client-Aufruf sieht folgendermaßen aus:

%Vor%

.. aber dies wird abgeraten, da Sie Flags (int-Werte) aus verschiedenen Klassen ohne Compiler-Check zusammenmischen können.

Im selben Buch ("Effective Java") sehe ich die Verwendung von EnumSet, aber dann wird Ihr Benutzeranruf:

%Vor%

Ich finde das ein bisschen ausführlich und ich bevorzuge die Eleganz von SWT.

Gibt es noch eine andere Alternative oder sind das im Grunde die beiden Geschmacksrichtungen, die Sie auswählen müssen?

    
Roalt 20.05.2011, 14:26
quelle

5 Antworten

7

Schätze, du hast eine Wand getroffen. Ich sehe keine andere Option. Java ist ausführlich, das ist eine Tatsache. In Situationen wie diesem füge ich normalerweise eine lokale Variable hinzu, um den Code lesbarer zu machen. Sie können dies tun,

%Vor%     
Aravindan R 20.05.2011, 14:30
quelle
2

Wenn Sie Bit-Style-Flags möchten, werden sie von Java in BitSet eingeschlossen. Es gibt es schon seit Ewigkeiten, aber nur wenige Leute machen sich daran, es zu benutzen (bevorzugen das Einbetten von C-Style Bit-Handling in Ints).

Die API für BitSet finden Sie hier .

Zusammen mit ein paar gut gewählten statischen Ints funktioniert es ziemlich gut, bis Sie damit beginnen, mehrere Bits in einem Durchgang zu prüfen und zu setzen.

    
Edwin Buck 20.05.2011 14:40
quelle
2

Ich rate Ihnen, mit dem EnumSet -Ansatz zu gehen.

%Vor%

Dieser Ansatz bietet eine bessere Typensicherheit, und Style , das eine Enumeration ist, wird volle OO-Fähigkeiten haben.

    
missingfaktor 20.05.2011 15:22
quelle
1

Verspätete Antwort für alle, die auf dieses Problem stoßen. Hier ist eine Möglichkeit, dies zu tun, um Speicher zu reduzieren und eine nette enum wie api zu haben:

%Vor%

Methode:

%Vor%

rufen Sie an:

%Vor%     
bertvanbrakel 20.04.2015 07:22
quelle
0

Wenn Sie nur eine begrenzte Anzahl von Methoden haben, die eine Reihe von Stilen verwenden (wie printText , in Ihrem Beispiel), können Sie ihre Signatur anpassen, um eine variable Anzahl von Style-Parametern zu verwenden:

%Vor%

Und dann sind Ihre Aufrufe sehr nah an der untypisierten (int) Flag-Route:

%Vor%

Leider gibt es keine EnumSet.of(E... ) factory, nur EnumSet.of(E first, E... more) , also benötigen Sie eine generische logicalOr Methode, um Ihr Array in erste + Rest-Chunks aufzuteilen. Links als Übung für den Leser =) .

    
John Hart 18.10.2017 19:08
quelle

Tags und Links