У каждого есть свои преимущества, и я понимаю различия, но что считается лучшей / стандартной практикой? И почему?
Например :
"myString".equals(myStringVar)
- Избегает потенциального NPE и не требует нулевой проверки. (Хорошая вещь?)
- Очиститель для чтения, так как проверка нуля не требуется.
- Если ноль не является ожидаемым значением, ваша программа может сломаться, не будучи мудрым.
Однако
myStringVar.equals("myString")
- Требуется проверка на ноль, если ноль является ожидаемым значением. (Хорошая вещь?)
- Может загромождать составные условия пустыми проверками.
- Позволяет NPE сообщить нам, если что-то сломалось.
Какой вариант считается стандартом для использования на Java и почему?
Ответы:
Я подозреваю, что это происходит из-за мер предосторожности, используемых при программировании на более старом C (или C ++). В C вы можете случайно назначить значение, когда хотите проверить равенство:
Это условие всегда будет истинным, так как это присваивание значения xa 3, а не проверка того, что x равен 3. Чтобы избежать этих тонких ошибок, разработчики начали отменять условие:
Он содержит ту же «ошибку», но сгенерирует ошибку компилятора, так что это безопаснее.
Более современные языки не имеют этой проблемы, и они могут легко предупредить вас, когда вы пытаетесь делать подобные вещи. Таким образом, это не очень чистое предпочтение, поэтому выберите один и используйте его последовательно.
источник
equals
. В отличие от C, проблема для Java заключается в том, что выражениеx.equals(y)
будет выбрасывать NPE, когда оноx
равно нулю. Если у вас есть строковый литерал,"something"
и вы хотите рассматривать случайnull
как «не равно», имеет смысл написать,"something".equals(y)
если вы не знаете,y
может ли оно быть нулевым. Это никогда не бросит NPE.Стандарт и хорошая практика будут зависеть от культуры организации, в которой вы работаете
Наш стандарт в .NET
myStringVar == "myString"
прост, потому что мы договорились об этом, то есть мы считаем, что он чистый и краткийПримечание: это не относится к Java из-за
==
сравнения ссылок вместо самих объектов. В Java вы должны использоватьmyStringVar.equals("myString")
.источник
==
потому что он сравнивает только ссылки на объекты. Тем не менее, +1 для setiment - конвенция часто определяет «правильный» способ ведения дел.myStringVar == "myString"
это очень плохая идея на Java (если вы не уверены,myStringVar
что интернированы).Я думаю, что вы правы в том, что это зависит от семантики нулевой переменной. Если вы не ожидаете, что он будет нулевым, и вам не придется проверять и обрабатывать его, то первая форма будет чище.
Тем не менее, вместо встраивания строкового литерала, лучшим вариантом, вероятно, будет следующее:
Особенно, если есть возможность использовать строку в большем количестве, чем один.
источник