Frage

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

Ich habe gesehen, dass SWT int als Bitfelder verwendet, wie zum Beispiel:

(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) {

  }
}

und Ihr Kundenanruf sieht so aus:

printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);

..aber davon wird abgeraten, da Sie Flags (int-Werte) aus verschiedenen Klassen ohne Compilerprüfungen miteinander mischen können.

Im selben Buch („Effective Java“) sehe ich die Verwendung von EnumSet, aber dann wird Ihr Benutzeraufruf zu:

printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));

Ich finde das etwas ausführlich und bevorzuge die Eleganz von SWT.

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

War es hilfreich?

Lösung

Erraten Sie, dass Sie eine Wand getroffen haben.Ich sehe keine andere Option.Java ist ausführlich, das ist eine Tatsache.In solchen Situationen fügen ich normalerweise eine lokale Variable hinzu, um den Code lesbarer zu machen.Sie können das tun,

generasacodicetagpre.

Andere Tipps

Wenn Sie Bit-Stil-Flags wünschen, wechselt Java sie in einen generationspflichtigen, in einem BitSet.Es ist schon in der Nähe, dennoch nur wenige Menschen haben es Mühe, es zu verwenden (bevorzugt die Bit-Bit-Bit-Abwicklung in Ints).

Die API für BitSet kann hier gefunden werden .

mit ein paar gut ausgewählten statischen Ints gekoppelt, ist es ziemlich gut, bis Sie in einem Durchgang in die Überprüfung und Einstellung mehrerer Bits eingeladen werden.

Ich rate Ihnen, mit dem zu gehen EnumSet Ansatz.

EnumSet<Style> styles = EnumSet.of(Style.Bold, Style.Italic);

Dieser Ansatz bietet eine bessere Typensicherheit und Style Da es sich um eine Enumeration handelt, stehen umfassende OO-Funktionen zur Verfügung.

späte Antwort für alle, die danach kommen.Hier ist eine Möglichkeit, um es zu tun, um den Gedächtnis zu reduzieren und ein nettes ENUM-API zu haben:

generasacodicetagpre.

-Methode:

generasacodicetagpre.

Anruf:

generasacodicetagpre.

Wenn Sie nur über eine begrenzte Anzahl von Methoden verfügen, die eine Reihe von Stilen verwenden (z. B printText, in Ihrem Beispiel), können Sie ihre Signatur anpassen, um eine variable Anzahl von Style-Parametern anzunehmen:

void printText(String text, Style... flags) {
  EnumSet<Style> style = logicalOr(flags); // see comment below
  ...
 }

Und dann liegen Ihre Aufrufe sehr nahe an der untyped (int)-Flag-Route:

printText("hello", Style.BOLD, Style.ITALIC);

Leider gibt es keine EnumSet.of(E... ) Fabrik, einfach EnumSet.of(E first, E... more), Sie benötigen also ein Generikum logicalOr Methode zum Aufteilen Ihres Arrays in erste + restliche Blöcke. Als Übung dem Leser überlassen =).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top