При сравнении строковой переменной со строковым литералом с помощью .equals (), существует ли стандартная практика для порядка элементов? [закрыто]

11

У каждого есть свои преимущества, и я понимаю различия, но что считается лучшей / стандартной практикой? И почему?

Например :

"myString".equals(myStringVar)
  • Избегает потенциального NPE и не требует нулевой проверки. (Хорошая вещь?)
  • Очиститель для чтения, так как проверка нуля не требуется.
  • Если ноль не является ожидаемым значением, ваша программа может сломаться, не будучи мудрым.

Однако

myStringVar.equals("myString")
  • Требуется проверка на ноль, если ноль является ожидаемым значением. (Хорошая вещь?)
  • Может загромождать составные условия пустыми проверками.
  • Позволяет NPE сообщить нам, если что-то сломалось.

Какой вариант считается стандартом для использования на Java и почему?

BrandonV
источник
2
Независимо от того, является ли null ожидаемым значением, должна ли операция «равно» быть местом, чтобы определить, является ли это проблемой?
Мэтью Флинн
Я не думаю, что это так. Но это мое мнение. Я хотел бы услышать обоснование других.
BrandonV
На языках, которые используют = и / или == для назначений / сравнений, обычно рекомендуется помещать то, что не может измениться, слева, чтобы вы не могли выполнить случайное назначение, когда вы намеревались сделать сравнение. Для языков, которые используют методы для таких объектов, как .equals, я не думаю, что это имеет значение.
GordonM

Ответы:

3

Я подозреваю, что это происходит из-за мер предосторожности, используемых при программировании на более старом C (или C ++). В C вы можете случайно назначить значение, когда хотите проверить равенство:

if (x = 3)

Это условие всегда будет истинным, так как это присваивание значения xa 3, а не проверка того, что x равен 3. Чтобы избежать этих тонких ошибок, разработчики начали отменять условие:

if (3 = x)

Он содержит ту же «ошибку», но сгенерирует ошибку компилятора, так что это безопаснее.

Более современные языки не имеют этой проблемы, и они могут легко предупредить вас, когда вы пытаетесь делать подобные вещи. Таким образом, это не очень чистое предпочтение, поэтому выберите один и используйте его последовательно.

Oleksi
источник
-1 Это не причина для соглашения Java equals. В отличие от C, проблема для Java заключается в том, что выражение x.equals(y)будет выбрасывать NPE, когда оно xравно нулю. Если у вас есть строковый литерал, "something"и вы хотите рассматривать случай nullкак «не равно», имеет смысл написать, "something".equals(y)если вы не знаете, yможет ли оно быть нулевым. Это никогда не бросит NPE.
Андрес Ф.
1
  • Стандарт и хорошая практика будут зависеть от культуры организации, в которой вы работаете

  • Наш стандарт в .NET myStringVar == "myString"прост, потому что мы договорились об этом, то есть мы считаем, что он чистый и краткий

Примечание: это не относится к Java из-за ==сравнения ссылок вместо самих объектов. В Java вы должны использовать myStringVar.equals("myString").

CodeART
источник
3
По крайней мере, в Java не используйте, ==потому что он сравнивает только ссылки на объекты. Тем не менее, +1 для setiment - конвенция часто определяет «правильный» способ ведения дел.
Майкл К
Спасибо за указание на это! Я обновил ответ :)
CodeART
@CodeWorks: я думаю, ты упустил точку зрения Майкла. Кроме того, это Java, а не JAVA.
Амара
Вопрос был: «а что считается лучшей / стандартной практикой? Почему?» Мой ответ таков: стандарт и лучшие практики варьируются от одной организации к другой. Вы не согласны с этим?
CodeART
@CodeWorks: Никто не может не согласиться с этим, CodeWorks. Но все могут согласиться с тем, что myStringVar == "myString"это очень плохая идея на Java (если вы не уверены, myStringVarчто интернированы).
Амара
0

Я думаю, что вы правы в том, что это зависит от семантики нулевой переменной. Если вы не ожидаете, что он будет нулевым, и вам не придется проверять и обрабатывать его, то первая форма будет чище.

Тем не менее, вместо встраивания строкового литерала, лучшим вариантом, вероятно, будет следующее:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

Особенно, если есть возможность использовать строку в большем количестве, чем один.

Бенджамин Вуттон
источник
2
-1: на самом деле не лучше; добавляет беспорядок с обычно незначительным значением
Амара
@sparkleshy - Не согласен, вы действительно не хотите, чтобы строковые литералы разбрызгивались в логике кода. Как упоминалось в оригинальном ответе, если строковый литерал используется в большем количестве, чем один, то я бы определенно сказал, чтобы реорганизовать их.
Бенджамин Вуттон
Чтобы сказать это, вы должны полностью распустить python, поскольку в python идентификаторы в основном являются строковыми литералами. И я думаю, что мы все должны согласиться с тем, что python - хороший язык.
Амара