2016-07-05 8 views
-1

Ich benutze den ternären Operator übermäßig, manchmal ersetze ich sogar sehr einfache if-Anweisungen damit. Zum Beispiel habe ich mich gerade etwas gefunden, wie diese zu ersetzen:Mit dem ternären Operator von Java, was bedeutet es, sich selbst eine Variable zuzuweisen?

if (foo != null) { 
    bar = foo; 
} 

mit diesem:

bar = (foo == null) ? bar : foo; 

Zwar ist es eine Frage des Geschmacks ist, die man liest, schöner, ich frage mich:

  • Ist in diesem Fall die Leistung der ternären Version schlechter?
  • Gibt es noch andere Gründe gegen die Verwendung von ternären hier?

Der Grund, warum ich die Leistung belive hier schlimmer sein könnte, ist, dass ich der Compiler nicht davon ausgehen, die ternäre für optimieren kann, wenn foo ist null. Daher könnte der Wert von bar wieder auf den gleichen Wert gesetzt werden, wodurch eine gewisse CPU-Zeit verschwendet wird, wobei die einfache if-Anweisung niemals an diesen Punkt gelangen würde. Aber mein Wissen über Compiler und Ausführung ist begrenzt, daher die Frage.

+1

Die Idee von etwas, das unter bestimmten Bedingungen in "bar = bar" "kollabiert", ist für mich seltsam. Die erste (mit der 'if'-Anweisung) ist ausführlicher, aber viel lesbarer und klarer. Meine $ 0.02 – Taylor

+1

Sie haben bereits Ihre eigene Frage beantwortet. das ist "Overhead" und unzweckmäßige Verwendung des ternären Operators. – Andrew

+0

Warum unterscheidet es sich von der Zuweisung von "i = i" für jede andere Variable? –

Antwort

3

Wenn Sie über den Stil besorgt haben, sollten Sie zumindest die Halterung Rauschen entfernen:

bar = foo == null ? bar : foo; 

Was die Leistung, haben Sie eine unnötige Zuordnung in dem Fall, dass foo null ist. Große Sache. Du redest über Nanosekunden.

Mach dir keine Sorgen über diesen unbedeutenden Unterschied der "Leistung". Sorgen Sie sich um die Lesbarkeit, die wichtiger ist.

In diesem Fall finde ich die if Version besser lesbar:

if (foo != null) { 
    bar = foo; 
} 

Es ist sehr klar, was die Absicht des Codes ist.

+0

Wenn ich darüber nachdenke, ist ein Grund, warum ich hier mit ternär gehe, dass ich 'foo == null 'über' foo! = Null' bevorzuge. Ich stimme auch zu, dass der Unterschied in der Leistung in den meisten Fällen keine Rolle spielt; wollte es nur sicher wissen. Womit ich nicht einverstanden bin, ist das Bracket-Less Ternary: Ich finde es viel einfacher, mit Klammern zu lesen. Aber das ist natürlich eine Frage des Geschmacks und der Gewohnheit. Übrigens habe ich meinen Code in die 'if'-Version geändert, da ich zustimme, dass es am einfachsten zu lesen ist (und jetzt beruhigt wurde, dass der ternäre einige Nanosekunden hinzufügen könnte). – domsson

+1

@domdom in Bezug auf 'foo == null' vs' foo! = Null', immer bevorzugen * positive * Tests (dh gleich, größer als, usw.) über * negative * Tests (nicht gleich, nicht größer als, usw.) wenn du kannst, weil sie für unsere kleinen menschlichen Gehirne einfacher zu lesen und zu verstehen sind. – Bohemian