Ich habe eine lange Reihe von Vergleichen in Java zu erledigen, und ich würde gerne wissen, ob einer oder mehrere davon als wahr herauskommen. Die Reihe der Vergleiche war lang und schwer zu lesen, daher habe ich sie aus Gründen der Lesbarkeit aufgelöst und automatisch einen Verknüpfungsoperator |=
anstelle von verwendet negativeValue = negativeValue || boolean
.
boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);
Ich erwarte negativeValue
, dass dies zutrifft, wenn einer der Standardwerte für <something> negativ ist. Ist das gültig? Wird es tun, was ich erwarte? Ich konnte nicht sehen, dass es auf Suns Site oder im Stackoverflow erwähnt wurde, aber Eclipse scheint kein Problem damit zu haben und der Code wird kompiliert und ausgeführt.
Wenn ich mehrere logische Schnittpunkte ausführen wollte, könnte ich &=
stattdessen anstelle von verwenden &&
?
quelle
||=
Operator geeignet , ist aber|=
die Kombinationsform des bitweisen Operators oder Operators.|=
Kurzschluss wäre mit anderen Operatorena |= b;
für die Zuweisung von Verbindungen unvereinbar, da dies nicht dasselbe wäre wiea = a | b;
mit der üblichen Einschränkung,a
zweimal auszuwerten (wenn es darauf ankommt). Es sieht für mich so aus, als ob die große Entscheidung über das Sprachverhalten nicht getroffen wurde||=
, also vermisse ich Ihren Standpunkt.Antworten:
Das
|=
ist eine Verbindung Zuweisungsoperator ( JLS 15.26.2 ) für den Booleschen logischen Operator|
( JLS 15.22.2 ); nicht zu verwechseln mit der Bedingung-oder||
( JLS 15.24 ). Darüber hinaus gibt es&=
und^=
entsprechend die Verbindung Zuordnung Version der boolean logischen&
und^
jeweils.Mit anderen Worten, denn
boolean b1, b2
diese beiden sind äquivalent:Der Unterschied zwischen den logischen Operatoren (
&
und|
) im Vergleich zu ihren bedingten Gegenstücken (&&
und||
) besteht darin, dass die ersteren nicht "kurzschließen"; Letztere tun. Das ist:&
und bewerten Sie|
immer beide Operanden&&
und||
den richtigen Operanden bedingt bewerten ; Der richtige Operand wird nur ausgewertet, wenn sein Wert das Ergebnis der Binäroperation beeinflussen könnte. Das bedeutet, dass der richtige Operand NICHT ausgewertet wird, wenn:&&
wertet auf ausfalse
false
)||
wertet auf austrue
true
)Zurück zu Ihrer ursprünglichen Frage: Ja, dieses Konstrukt ist gültig, und obwohl
|=
es nicht genau eine äquivalente Verknüpfung für=
und ist||
, berechnet es, was Sie wollen. Da die rechte Seite des|=
Operators in Ihrer Verwendung eine einfache Ganzzahlvergleichsoperation ist, ist die Tatsache, dass|
kein Kurzschluss auftritt, unerheblich.Es gibt Fälle, in denen ein Kurzschluss gewünscht oder sogar erforderlich ist, Ihr Szenario jedoch nicht dazu gehört.
Es ist bedauerlich, dass Java im Gegensatz zu einigen anderen Sprachen kein
&&=
und hat||=
. Dies wurde in der Frage diskutiert, warum Java keine zusammengesetzten Zuweisungsversionen der Bedingungs- und und Bedingungs- oder Operatoren hat. (&& =, || =) .quelle
|
Es ist kein "Shortcut" -Operator (oder Kurzschlussoperator) in der Weise, wie || und && sind (insofern werden sie die RHS nicht bewerten, wenn sie das Ergebnis basierend auf der LHS bereits kennen), aber es wird tun, was Sie in Bezug auf die Arbeit wollen .
Als Beispiel für den Unterschied ist dieser Code in Ordnung, wenn er
text
null ist:während dies nicht wird:
(Natürlich könnten Sie dies
"".equals(text)
für diesen speziellen Fall tun - ich versuche nur, das Prinzip zu demonstrieren.)quelle
Sie könnten nur eine Aussage haben. Über mehrere Zeilen ausgedrückt, liest es sich fast genau wie Ihr Beispielcode, nur weniger wichtig:
Für einfachste Ausdrücke kann die Verwendung
|
schneller sein als||
weil, obwohl ein Vergleich vermieden wird, die implizite Verwendung einer Verzweigung bedeutet und dies um ein Vielfaches teurer sein kann.quelle
Obwohl es für Ihr Problem übertrieben sein könnte, ist das Guava- Bibliothek eine nette Syntax mit
Predicate
s und führt eine Kurzschlussauswertung von oder / undPredicate
s durch.Im Wesentlichen werden die Vergleiche in Objekte umgewandelt, in eine Sammlung gepackt und dann wiederholt. Für oder Prädikate kehrt der erste echte Treffer aus der Iteration zurück und umgekehrt für und.
quelle
Wenn es um Lesbarkeit geht, habe ich das Konzept der Trennung von getesteten Daten aus der Testlogik. Codebeispiel:
Der Code sieht ausführlicher und selbsterklärender aus. Sie können sogar ein Array im Methodenaufruf erstellen, wie folgt:
Es ist besser lesbar als 'Vergleichszeichenfolge' und hat auch den Leistungsvorteil des Kurzschlusses (auf Kosten der Arrayzuweisung und des Methodenaufrufs).
Bearbeiten: Noch mehr Lesbarkeit kann einfach durch Verwendung von varargs-Parametern erreicht werden:
Methodensignatur wäre:
Und der Anruf könnte so aussehen:
quelle
Es ist ein alter Beitrag, aber um Anfängern eine andere Perspektive zu bieten, möchte ich ein Beispiel geben.
Ich denke, der häufigste Anwendungsfall für einen ähnlichen zusammengesetzten Operator wäre
+=
. Ich bin sicher, wir haben alle so etwas geschrieben:Was war der Sinn davon? Es ging darum, Boilerplate zu vermeiden und den sich wiederholenden Code zu eliminieren.
Die nächste Zeile macht also genau das Gleiche und vermeidet es, die Variable
b1
zweimal in dieselbe Zeile einzugeben.quelle
longNameOfAccumulatorAVariable += 5;
vs.longNameOfAccumulatorAVariable = longNameOfAccumulatorVVariable + 5;
quelle
negativeValue = defaultStock < 0 || defaultWholesale < 0
usw. Abgesehen von der Ineffizienz all des Boxens und Verpackens, das hier stattfindet, finde ich es nicht annähernd so einfach zu verstehen, was Ihr Code wirklich bedeuten würde.|| logisches boolesches ODER
| bitweise ODER
| = bitweises Inklusiv-ODER und Zuweisungsoperator
Der Grund, warum | = nicht kurzschließt, ist, dass es ein bitweises ODER kein logisches ODER ausführt. Das heißt:
Tutorial für Java-Operatoren
quelle
|
ist ein ganzzahliges bitweises ODER, aber auch ein logisches ODER - siehe Java-Sprachspezifikation 15.22.2.