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


11

Для кожного є користь, і я розумію відмінності, але що вважається найкращою / стандартною практикою? І чому?

Наприклад :

"myString".equals(myStringVar)
  • Уникає потенційного NPE і не вимагає перевірки нуля. (Гарна річ?)
  • Чистіше читати, оскільки нульова перевірка не потрібна.
  • Якщо null не є очікуваним значенням, ваша програма може зламатись, не ставши мудрішим.

Однак

myStringVar.equals("myString")
  • Потрібна перевірка нуля, якщо null є очікуваним значенням. (Гарна річ?)
  • Може захаращувати складні умови за допомогою нульових перевірок.
  • Дозволяє NPE повідомити нас, якщо щось порушилось.

Який варіант вважається стандартним для використання в Java і чому?


2
Незалежно від того, чи є нуль очікуваним значенням, чи слід операції "дорівнює" визначити, що це проблема?
Меттью Флінн

Я не думаю, що це так. Але це моя думка. Я хотів би почути обґрунтування інших.
БрендонВ

У мовах, які використовують = і / або == для призначення / порівняння, як правило, найкраща практика розміщувати те, що не може змінитися, зліва, щоб ви не могли виконати випадкове завдання, коли ви мали намір порівняти. Для мов, які використовують методи на об'єкті, наприклад .equals, я не думаю, що це має значення.
GordonM

Відповіді:


3

Я підозрюю, що це походить від запобіжних заходів, що застосовуються під час програмування на старих C (або C ++). У C ви можете випадково призначити значення, коли ви хочете перевірити рівність:

if (x = 3)

Ця умова завжди буде вірною, оскільки це значення присвоєння xa 3, а не перевірка того, що x дорівнює 3. Щоб уникнути цих тонких помилок, розробники почали скасовувати умову:

if (3 = x)

Він містить ту саму «помилку», але генерує помилку компілятора, тому це безпечніше.

Більш сучасні мови не мають цієї проблеми, і вони можуть вас легко попередити, коли ви намагаєтеся робити такі речі. Таким чином, це не дуже чисті переваги, тому вибирайте одне та використовуйте його послідовно.


-1 Це не причина для конвенції Java для equals. На відміну від C, проблема для Java полягає в тому, що вираз x.equals(y)буде кидати NPE, коли xце null. Якщо у вас є Stral literal "something"і ви хочете вважати випадок null"не рівним", має сенс написати, "something".equals(y)якщо ви не знаєте, чи yможе бути нульовим. Це ніколи не кине NPE.
Андрес Ф.

1
  • Стандартні та добрі практики залежать від культури організації, в якій ви працюєте

  • Наш стандарт у .NET - це myStringVar == "myString"просто тому, що ми домовилися про нього, тобто ми вважаємо, що це чисто і стисло

Примітка. Це не стосується Java через ==порівняння посилань замість самих об'єктів. На Java ви повинні використовувати myStringVar.equals("myString").


3
Принаймні, на Java не використовуйте, ==оскільки вона порівнює лише посилання на об'єкти. Але це означає, що +1 для контингенту - конвенція часто визначає "правильний" спосіб дій.
Майкл К

Дякую, що вказали на це! Я оновив відповідь :)
CodeART

@CodeWorks: Я думаю, ти пропустив точку Майкла. Крім того, це Java, а не JAVA.
amara

Питання було: "але що вважається найкращою / стандартною практикою? Чому?" Моя відповідь полягає в тому, що стандартна та найкраща практика варіюється від однієї організації до іншої. Ви не згодні з цим?
CodeART

@CodeWorks: Ніхто не міг погодитися з цим, CodeWorks. Але всі могли погодитися, що myStringVar == "myString"це дуже погана ідея для Java (якщо ви абсолютно впевнені, що myStringVarце інтерновано).
amara

0

Я думаю, ти маєш рацію в тому, що це залежить від семантики нульовості змінної. Якщо ви не очікуєте, що це буде недійсним і не потрібно перевіряти та обробляти його, тоді перша форма чистіша.

Однак, замість того, щоб вставляти рядковий буквал, кращим варіантом, мабуть, буде такий:

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

Особливо, якщо є потенціал для використання рядка в більшому місці, ніж в одному.


2
-1: насправді не краще; додає захаращеність із зазвичай мізерною цінністю
amara

@sparkleshy - Не погоджуючись, ви дійсно не хочете, щоб рядкові літерали посипалися через вашу логіку коду. Як було сказано в оригінальній відповіді, якщо буквений рядок використовується в більшому місці, ніж один, то я б точно сказав скасувати їх.
Бенджамін Вуттон

Щоб сказати це, вам доведеться ретельно скинути python, оскільки в python ідентифікатори в основному є ARE рядними літералами. І я думаю, що ми всі повинні погодитися, що пітон - це чудова мова.
amara
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.