เรากำลังใช้งานอะแดปเตอร์สำหรับ Jaxen (ไลบรารี XPath สำหรับ Java) ที่ช่วยให้เราใช้ XPath เพื่อเข้าถึงโมเดลข้อมูลของแอปพลิเคชันของเรา
สิ่งนี้ทำได้โดยการใช้คลาสที่จับคู่สตริง (ส่งถึงเราจาก Jaxen) ไปยังองค์ประกอบของโมเดลข้อมูลของเรา เราประเมินว่าเราต้องการประมาณ 100 คลาสโดยมีการเปรียบเทียบสตริงมากกว่า 1,000 รายการ
ฉันคิดว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือง่ายถ้าคำสั่ง / else พร้อมสตริงที่เขียนลงในโค้ดโดยตรงแทนที่จะกำหนดแต่ละสตริงเป็นค่าคงที่ ตัวอย่างเช่น:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
อย่างไรก็ตามฉันถูกสอนเสมอว่าเราไม่ควรฝังค่าสตริงลงในรหัสโดยตรง แต่สร้างค่าคงที่สตริงแทน ที่จะมีลักษณะเช่นนี้:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
ในกรณีนี้ฉันคิดว่ามันเป็นความคิดที่ไม่ดี ค่าคงที่จะถูกใช้ครั้งเดียวเท่านั้นในgetNode()
วิธีการ การใช้สตริงโดยตรงนั้นง่ายต่อการอ่านและทำความเข้าใจเหมือนกับการใช้ค่าคงที่และช่วยให้เราเขียนโค้ดอย่างน้อยหนึ่งพันบรรทัด
ดังนั้นมีเหตุผลใดที่จะกำหนดค่าคงที่สตริงสำหรับการใช้งานครั้งเดียว? หรือเป็นที่ยอมรับในการใช้สตริงโดยตรง
PS ก่อนใครแนะนำให้ใช้ enums แทนเราทำต้นแบบว่า แต่การแปลง enum ช้ากว่าการเปรียบเทียบสตริงธรรมดา 15 เท่าดังนั้นจึงไม่ได้รับการพิจารณา
สรุป: คำตอบด้านล่างขยายขอบเขตของคำถามนี้นอกเหนือจากค่าคงที่สตริงดังนั้นฉันจึงมีข้อสรุปสองข้อ:
- อาจเป็นไปได้ที่จะใช้สตริงโดยตรงแทนที่จะเป็นค่าคงที่สตริงในสถานการณ์นี้แต่
- มีวิธีหลีกเลี่ยงการใช้สตริงเลยซึ่งอาจจะดีกว่า
ดังนั้นฉันจะลองใช้เทคนิค wrapper ซึ่งหลีกเลี่ยงสตริงอย่างสมบูรณ์ น่าเสียดายที่เราไม่สามารถใช้คำสั่ง string switch ได้เนื่องจากเรายังไม่ได้ใช้บน Java 7 ในท้ายที่สุดฉันคิดว่าคำตอบที่ดีที่สุดสำหรับเราคือการลองใช้เทคนิคแต่ละอย่างและประเมินประสิทธิภาพ ความจริงก็คือถ้าเทคนิคหนึ่งเร็วขึ้นอย่างเห็นได้ชัดเราอาจเลือกโดยไม่คำนึงถึงความงามหรือการยึดมั่นในการประชุม
switch
ป้ายกำกับ ใช้สวิตช์แทนการเรียงif
ซ้อน