Frage

Ich habe eine lange Reihe von Vergleich in Java zu tun, und ich möchte, wenn ein oder mehr von ihnen als wahr herauskommen kennen. Die Kette der Vergleiche war lang und schwer zu lesen, so dass ich es für die Lesbarkeit brach auf und ging automatisch eher eine Verknüpfung Operator |= zu verwenden, als negativeValue = negativeValue || boolean.

boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);

Ich erwarte, dass negativeValue um wahr zu sein, wenn eine des Standard Werte negativ sind. Ist dies gültig? Wird es das tun, was ich erwarten? Ich konnte nicht sehen, es auf dem Sun-Website oder Stackoverflow erwähnt, aber von Eclipse scheint nicht ein Problem damit zu haben und der Code kompiliert und ausgeführt.


Und wenn ich mehrere logische Schnittstellen durchführen wollte, könnte ich verwenden &= statt &&?

War es hilfreich?

Lösung

Die |= ist eine Verbindung Zuweisungsoperator ( JLS 15.26.2 ) für die booleschen logischen Operator | ( JLS 15.22.2 ); nicht mit dem bedingten oder || ( Warum Java haben keine Verbindung Zuordnung Versionen des bedingten und und bedingten oder Betreibers? (&& =, || =) .

Andere Tipps

Es ist nicht eine „Abkürzung“ (oder Kurzschluss) Operator in der Art und Weise, dass || und && sind (da sie nicht die RHS beurteilen, ob sie bereits wissen, das Ergebnis auf der Grundlage der LHS), aber es wird tun, was Sie wollen in Bezug auf arbeiten .

Als Beispiel für den Unterschied, wird dieser Code in Ordnung, wenn text null ist:

boolean nullOrEmpty = text == null || text.equals("")

Erwägung, dass dies nicht:

boolean nullOrEmpty = false;
nullOrEmpty |= text == null;
nullOrEmpty |= text.equals(""); // Throws exception if text is null

(Offensichtlich Sie "".equals(text) für diesen speziellen Fall tun konnte. - Ich bin nur um das Prinzip zu demonstrieren versuchen)

Sie können nur eine Erklärung haben. mehrere Linien überexprimiert es fast genau wie Ihr Beispielcode liest, nur weniger zwingend notwendig:

boolean negativeValue
    = defaultStock < 0 
    | defaultWholesale < 0
    | defaultRetail < 0
    | defaultDelivery < 0;

Für einfachste Ausdrücke, | verwendet, kann schneller sein als || denn obwohl es einen Vergleich vermeidet tut es bedeutet, mit einem Zweig implizit und das kann oft teurer sein.

Auch wenn es für Ihr Problem sein könnte viel des Guten, die Guava Bibliothek hat einige nette Syntax mit Predicates und tut Kurzauswertung von oder / und Predicates.

Im Wesentlichen werden die Vergleiche in Objekte verwandelt, in eine Sammlung verpackt und dann iteriert. Für oder Prädikate, der erste echte Hit kehrt von der Iteration, und umgekehrt für und.

Wenn es um Lesbarkeit ich das Konzept der Trennung habe getestet Daten von der Testlogik. Codebeispiel:

// declare data
DataType [] dataToTest = new DataType[] {
    defaultStock,
    defaultWholesale,
    defaultRetail,
    defaultDelivery
}

// define logic
boolean checkIfAnyNegative(DataType [] data) {
    boolean negativeValue = false;
    int i = 0;
    while (!negativeValue && i < data.length) {
        negativeValue = data[i++] < 0;
    }
    return negativeValue;
}

Der Code sieht ausführliche und selbsterklärend.

: Sie können sogar ein Array in Methodenaufruf, wie diese erstellen
checkIfAnyNegative(new DataType[] {
    defaultStock,
    defaultWholesale,
    defaultRetail,
    defaultDelivery
});

Es ist besser lesbar als ‚Vergleichsstring‘ und hat auch Performance-Vorteil von Kurzschließen (auf Kosten des Array-Zuweisung und Methodenaufruf).

Edit: Auch können mehr Lesbarkeit einfach mit varargs Parameter erreicht werden:

Methode Signatur wäre:

boolean checkIfAnyNegative(DataType ... data)

Und der Aufruf könnte wie folgt aussehen:

checkIfAnyNegative( defaultStock, defaultWholesale, defaultRetail, defaultDelivery );

Es ist eine alte Post, sondern um eine andere Perspektive für Anfänger zur Verfügung zu stellen, würde Ich mag ein Beispiel geben.

Ich denke, die häufigste Anwendungsfall für eine ähnliche Verbindung Operator += wäre. Ich bin sicher, dass alles, was wir schrieb etwas wie folgt aus:

int a = 10;   // a = 10
a += 5;   // a = 15

Was war der Punkt, der das? Der Punkt war vorformulierten zu vermeiden und die sich wiederholenden Code zu beseitigen.

Also, tut nächste Zeile genau die gleiche, die Vermeidung der variablen b1 zweimal in derselben Zeile eingeben.

b1 |= b2;
List<Integer> params = Arrays.asList (defaultStock, defaultWholesale, 
                                       defaultRetail, defaultDelivery);
int minParam = Collections.min (params);
negativeValue = minParam < 0;

|| Logischer OR
| bitweise ODER

| = bitweise inklusive OR Zuweisungs-Operator

Der Grund, warum | = shortcircit nicht ist, weil es eine bitweise tut oder nicht eine logische ODER-Verknüpfung. Das heißt:

C |= 2 is same as C = C | 2

Tutorial für Java-Operatoren

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