2016-07-05 5 views
-1

Я делаю чрезмерное использование тернарного оператора, иногда даже заменяя очень простые утверждения с ним. Например, я только что нашел себе замену что-то вроде этого:Использование тернарного оператора Java, что подразумевает назначение переменной самому себе?

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

с этим:

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

Хотя это вопрос вкуса, который один читает лучше, я задаюсь вопросом:

  • В этом случае хуже производительность тернарной версии?
  • Есть ли другие причины против использования троичного здесь?

Причина, почему я верю, производительность может быть хуже, в том, что я предполагаю, что компилятор не может оптимизировать троичной для того, когда foo является null. Следовательно, значение bar может быть снова установлено на одно и то же значение, теряя некоторое время процессора, где простой оператор if никогда не дойдет до этой точки. Но мои знания о компиляторах и исполнении ограничены, поэтому вопрос.

+1

Идея чего-то, что «рушится» в определенных условиях в «bar = bar», странно для меня. Первый (с выражением 'if') является более подробным, но более читаемым и понятным. Мои $ 0.02 – Taylor

+1

Вы уже ответили на свой вопрос. это «накладные расходы» и нецелевое использование тернарного оператора. – Andrew

+0

Почему это может отличаться от назначения i = i для любой другой переменной? –

ответ

3

Если вы имеете беспокоиться о стиле, вы должны по крайней мере, удалить шум кронштейна:

bar = foo == null ? bar : foo; 

Что касается производительности, то есть ненужное назначение в том случае, foo является нулевым. Большая сделка. Вы говорите о наносекундах.

Не беспокойтесь об этой незначительной разнице в «производительности». Беспокойство о читаемости, что более важно.

В этом случае, я считаю, версия if более читаемым:

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

Это очень ясно, что намерение код.

+0

Думая об этом, одна из причин, по которой я пошел с тройной, - это то, что я предпочитаю 'foo == null' над' foo! = Null'. Кроме того, я согласен с тем, что разница в производительности не будет иметь большого значения в большинстве случаев; просто хотел знать наверняка, тем не менее. То, с чем я не согласен, - это бесстрашный троянец: мне легче читать его с помощью скобок. Но это, конечно, вопрос вкуса и привычки. Кстати, я сменил свой код на версию 'if', поскольку я согласен с тем, что его легче всего читать (и теперь его успокоили, что троичный может добавить несколько наносекунд). – domsson

+1

@domdom относительно 'foo == null' vs' foo! = Null', всегда предпочитайте * положительные * тесты (т.е. равные, больше и т. Д.) Над * отрицательными * тестами (не равными, не более и т. Д.). если можно, потому что их крошечные человеческие мозги легче читать и понимать. – Bohemian