Bir dize değişkenini .equals () ile bir dize değişmeziyle karşılaştırırken, öğelerin sırası için standart bir uygulama var mı? [kapalı]


11

Her birinin faydaları var ve farklılıkları anlıyorum, ama en iyi / standart uygulama olarak kabul edilen nedir? Ve neden?

Örneğin :

"myString".equals(myStringVar)
  • Potansiyel bir NPE'den kaçınır ve boş bir kontrol gerektirmez. (İyi bir şey?)
  • Boş kontrol gerekli olmadığından okunması daha temizdir.
  • Null beklenen bir değer değilse, programınız daha akıllıca olmadan kesiliyor olabilir.

ancak

myStringVar.equals("myString")
  • Null değerinin beklenen bir değer olup olmadığını null denetimi gerektirir. (İyi bir şey?)
  • Bileşik koşullarını boş denetimlerle karıştırabilir.
  • NPE'nin bir şeyin kırılıp kırılmadığını bize bildirmesine izin verir.

Hangi varyasyon Java için standart olarak kabul edilir ve neden?


2
Boş değer beklenen bir değer olup olmadığı, "eşittir" işlemi bunun sorun olduğunu belirleyecek bir yer olmalı mı?
Matthew Flynn

Ben öyle düşünmüyorum. Ama bu benim görüşüm. Başkalarının mantığını duymak isterim.
BrandonV

Ödevler / karşılaştırmalar için = ve / veya == kullanan dillerde, bir karşılaştırma yapmak istediğinizde yanlışlıkla atama yapamamanız için, değişemeyen şeyi solda koymak normalde en iyi uygulamadır. .Equals gibi bir nesne üzerinde yöntem kullanan diller için bunun önemli olduğunu düşünmüyorum.
GordonM

Yanıtlar:


3

Bunun eski C (veya C ++) programlanırken kullanılan bir güvenlik önleminden kaynaklandığından şüpheleniyorum. C'de, eşitliği test etmek istediğinizde yanlışlıkla bir değer atayabilirsiniz:

if (x = 3)

Bu koşul her zaman doğru olacaktır, çünkü xa değeri 3 olarak atanır, x'in 3'e eşit olmadığını test etmez. Bu ince hataları önlemek için, geliştiriciler durumu tersine çevirmeye başladı:

if (3 = x)

Bu aynı "hata" içerir, ancak bir derleyici hatası üretecektir, bu yüzden daha güvenlidir.

Daha modern dillerin bu sorunu yoktur ve bu tür şeyleri yapmaya çalıştığınızda sizi kolayca uyarabilirler. Bu nedenle, neredeyse saf bir tercih değil, bu yüzden birini seçin ve tutarlı bir şekilde kullanın.


-1 Java sözleşmesinin nedeni bu değil equals. C'den farklı olarak, Java sorunu, ifadenin boş x.equals(y)olduğunda NPE atmasıdır x. Bir String değişmeziniz "something"varsa ve durumu null"eşit değil" olarak değerlendirmek istiyorsanız, null "something".equals(y)olup olmadığını bilmiyorsanız yazmak mantıklıdır y. Bu asla bir NPE atmayacaktır.
Andres

1
  • Standart ve iyi uygulama, çalışmakta olduğunuz bir kuruluşun kültürüne göre değişir

  • myStringVar == "myString".NET'teki standardımız sadece üzerinde anlaştığımız için, yani temiz ve kısaca olduğuna inanıyoruz

Not:== Nesnelerin kendileri yerine referansların karşılaştırılması nedeniyle Java için geçerli değildir . Java'da kullanmanız gerekir myStringVar.equals("myString").


3
En azından Java'da, ==yalnızca nesne başvurularını karşılaştırdığı için kullanmayın . Bununla birlikte, anlaşmazlık için +1, genellikle bir şeyler yapmanın "doğru" yolunu tanımlar.
Michael K

Bunu işaret ettiğiniz için teşekkür ederiz! Cevabı güncelledim :)
CodeART

@CodeWorks: Sanırım Michael'ın amacını kaçırdınız. Ayrıca, Java JAVA değil.
amara

Soru şuydu: "ama en iyi / standart uygulama nedir? Neden?" Cevabım, standart ve en iyi uygulamanın bir kuruluştan diğerine değiştiği yönündedir. Buna katılmıyor musunuz?
CodeART

@CodeWorks: Kimse buna katılmıyordu CodeWorks. Ancak herkes bunun myStringVar == "myString"Java üzerinde oldukça kötü bir fikir olduğunu kabul edebilir (kesinlikle emin olmadığınız sürece myStringVar).
amara

0

Değişkenin geçersizlik semantiğine bağlı olması konusunda haklı olduğunuzu düşünüyorum. Boş olmasını beklemiyorsanız ve kontrol edip işlemeniz gerekmiyorsa, ilk form daha temizdir.

Bununla birlikte, dize hazır bilgisini gömmek yerine, daha iyi bir seçenek muhtemelen şöyle olurdu:

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

Özellikle ipi birden fazla yerde kullanma potansiyeli varsa.


2
-1: aslında daha iyi değil; genellikle önemsiz değere sahip dağınıklık ekler
amara

@sparkleshy - Katılmıyorum, gerçekten kod mantığınıza serpiştirilmiş dizgi değişmezleri istemezsiniz. Orijinal cevapta belirtildiği gibi, dize değişmezi birden fazla yerde kullanılıyorsa, kesinlikle onları yeniden düzenlemeyi söyleyebilirim.
Benjamin Wootton

Bunu söylemek için, python'da tanımlayıcılar temelde string değişmezler olduğundan, python'u tamamen dağıtmanız gerekir. Ve sanırım hepimiz python'un iyi bir dil olduğu konusunda hemfikir olmalıyız.
amara
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.