เมื่อเปรียบเทียบตัวแปรสตริงกับสตริงตัวอักษรกับ. equals () มีวิธีปฏิบัติมาตรฐานสำหรับลำดับของรายการหรือไม่ [ปิด]


11

มีประโยชน์สำหรับแต่ละคนและฉันเข้าใจความแตกต่าง แต่สิ่งที่ถือว่าเป็นวิธีที่ดีที่สุด / มาตรฐาน? และทำไม?

ตัวอย่างเช่น :

"myString".equals(myStringVar)
  • หลีกเลี่ยง NPE ที่อาจเกิดขึ้นและไม่จำเป็นต้องมีการตรวจสอบ null (สิ่งที่ดี?)
  • ทำความสะอาดเพื่ออ่านเนื่องจากไม่จำเป็นต้องตรวจสอบ null
  • หากค่า Null ไม่ใช่ค่าที่คาดหวังโปรแกรมของคุณอาจแตกหักโดยไม่ต้องมีไหวพริบ

อย่างไรก็ตาม

myStringVar.equals("myString")
  • ต้องมีการตรวจสอบ null หากค่า null เป็นค่าที่คาดไว้ (สิ่งที่ดี?)
  • สามารถถ่วงเงื่อนไขผสมกับการตรวจสอบเป็นโมฆะ
  • ช่วยให้ NPE แจ้งให้เราทราบว่ามีบางอย่างผิดปกติ

รูปแบบใดที่ถือว่าเป็นมาตรฐานที่ใช้สำหรับ Java และทำไม


2
ไม่ว่า null จะเป็นค่าที่คาดหวังหรือไม่การดำเนินการ "เท่ากับ" ควรเป็นสถานที่เพื่อพิจารณาว่านี่เป็นปัญหาหรือไม่
Matthew Flynn

ฉันไม่คิดว่ามันจะเป็น แต่นั่นคือความคิดเห็นของฉัน ฉันต้องการฟังเหตุผลของผู้อื่น
BrandonV

ในภาษาที่ใช้ = และ / หรือ == สำหรับการมอบหมาย / การเปรียบเทียบเป็นวิธีปฏิบัติที่ดีที่สุดในการวางสิ่งที่ไม่สามารถเปลี่ยนแปลงได้ทางซ้ายเพื่อให้คุณไม่สามารถทำการมอบหมายโดยไม่ได้ตั้งใจเมื่อคุณต้องการทำการเปรียบเทียบ สำหรับภาษาที่ใช้วิธีการกับวัตถุเช่น. เท่ากับฉันไม่คิดว่ามันสำคัญ
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ไม่มีค่า หากคุณมีตัวอักษร String "something"และคุณต้องการพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่nullว่า "ไม่เท่ากับ" "something".equals(y)คุณควรเขียนถ้าคุณไม่รู้ว่าyเป็นโมฆะหรือไม่ สิ่งนี้จะไม่โยน NPE
Andres F.

1
  • มาตรฐานและแนวปฏิบัติที่ดีอาจแตกต่างกันไปตามวัฒนธรรมขององค์กรที่คุณทำงานอยู่

  • มาตรฐานของเราใน. NET นั้นเป็นmyStringVar == "myString"เพียงเพราะเราได้ตกลงกันไว้นั่นคือเราเชื่อว่ามันสะอาดและน่าเชื่อถือ

หมายเหตุ:สิ่งนี้ใช้ไม่ได้กับ Java เนื่องจาก==เปรียบเทียบการอ้างอิงแทนที่จะเป็นวัตถุเอง ใน Java myStringVar.equals("myString")คุณควรจะใช้


3
อย่างน้อยใน Java อย่าใช้==เพราะมันเปรียบเทียบการอ้างอิงวัตถุเท่านั้น ที่กล่าวว่า +1 สำหรับ setiment - การประชุมมักจะกำหนดวิธีการ "ทำสิ่งที่ถูกต้อง"
Michael K

ขอบคุณสำหรับการชี้ให้เห็น! ฉันได้อัพเดตคำตอบแล้ว :)
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 - ไม่เห็นด้วยจริงๆคุณไม่ต้องการให้ตัวอักษรสตริงโรยผ่านตรรกะรหัสของคุณ ดังที่ได้กล่าวไปแล้วในคำตอบดั้งเดิมหากใช้ตัวอักษรของสตริงในที่ที่มากกว่าหนึ่งแล้วฉันจะต้องพูดซ้ำอีกครั้ง
Benjamin Wootton

เพื่อบอกว่าคุณต้องแยกไพ ธ อนออกอย่างละเอียดเนื่องจากในไพ ธ อนตัวระบุโดยทั่วไปจะเป็นตัวอักษรสตริง และฉันคิดว่าเราทุกคนต้องยอมรับว่าหลามเป็นภาษาที่ดี
amara
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.