การส่ง enums ระหว่างโค้ด Java ของฉันและแอปฐานข้อมูลหรือไคลเอนต์ฉันมักจะจบลงด้วยการอ่านและเขียนค่า enum เป็นสตริง toString()
เรียกว่าปริยายเมื่อเชื่อมสตริง การเอาชนะ toString () ในบาง enums หมายความว่าบางครั้งฉันก็ทำได้
"<input type='checkbox' value='" + MY_CONST1 + "'>"
และบางครั้งฉันก็จำได้ว่าต้องโทร
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
ซึ่งนำไปสู่ข้อผิดพลาดดังนั้นฉันจะไม่ทำเช่นนั้นอีก ที่จริงแล้วฉันไม่ได้แทนที่วิธีการใด ๆใน Enum เพราะถ้าคุณโยนรหัสลูกค้าให้มากพอคุณจะทำลายความคาดหวังของใครบางคนในที่สุด
ทำให้ชื่อของวิธีการใหม่ของคุณเองเช่นpublic String text()
หรือtoEnglish()
หรืออะไรก็ตาม
นี่คือฟังก์ชั่นตัวช่วยเล็ก ๆ น้อย ๆ ที่สามารถช่วยคุณประหยัดการพิมพ์บางอย่างถ้าคุณมีจำนวนเงินมากมายเช่นด้านบน:
public static String ucFirstLowerRest(String s) {
if ( (s == null) || (s.length() < 1) ) {
return s;
} else if (s.length() == 1) {
return s.toUpperCase();
} else {
return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
}
}
เป็นเรื่องง่ายที่จะโทรหา. toUpperCase () หรือ. toLowerCase () แต่การเรียกคืนตัวพิมพ์เล็กอาจยุ่งยาก พิจารณาสี "bleu de France" ฝรั่งเศสมีตัวพิมพ์ใหญ่เสมอดังนั้นคุณอาจต้องการเพิ่มวิธี textLower () ลงใน enum ของคุณหากคุณพบเจอ เมื่อคุณใช้ข้อความนี้ที่จุดเริ่มต้นของประโยคเทียบกับตรงกลางของประโยคเทียบกับในชื่อคุณจะเห็นว่าวิธีการเดียวtoString()
จะสั้นลง และนั่นไม่แม้แต่จะแตะตัวอักษรที่ผิดกฎหมายในตัวระบุ Java หรือนั่นเป็นความเจ็บปวดที่จะพิมพ์เพราะมันไม่ได้แสดงบนแป้นพิมพ์มาตรฐานหรือตัวอักษรที่ไม่มีตัวพิมพ์ (คันจิเป็นต้น)
enum Color {
BLEU_DE_FRANCE {
@Override public String textTc() { return "Bleu De France"; }
@Override public String textLc() { return "bleu de France"; }
}
CAFE_NOIR {
@Override public String textTc() { return "Café Noir"; }
}
RED,
YELLOW,
GREEN;
// The text in title case
private final String textTc;
private Color() {
textTc = ucFirstLowerRest(this.toString());
}
// Title case
public String textTc() { return textTc; }
// For the middle of a sentence
public String textLc() { return textTc().toLowerCase(); }
// For the start of a sentence
public String textUcFirst() {
String lc = textLc();
return lc.substring(0, 1).toUpperCase() + lc.substring(1);
}
}
การใช้สิ่งเหล่านี้อย่างไม่ยาก:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
หวังว่าจะแสดงให้เห็นว่าทำไมการใช้ค่า enum แบบผสมจะทำให้คุณผิดหวังเช่นกัน เหตุผลสุดท้ายข้อหนึ่งที่ต้องรักษาด้วยตัวพิมพ์ใหญ่ทั้งหมดที่มีเครื่องหมายขีดล่างคือค่าคงที่คือการทำตามหลักการของความคลาดเคลื่อนน้อยที่สุด ผู้คนคาดหวังมันดังนั้นหากคุณทำสิ่งที่แตกต่างคุณมักจะต้องอธิบายตนเองหรือจัดการกับคนที่ใช้รหัสของคุณในทางที่ผิด