Gửi enum giữa mã Java của tôi và cơ sở dữ liệu hoặc ứng dụng khách, tôi thường kết thúc việc đọc và viết các giá trị enum dưới dạng chuỗi. toString()
được gọi ngầm khi nối chuỗi. Ghi đè toString () trên một số enum có nghĩa là đôi khi tôi chỉ có thể
"<input type='checkbox' value='" + MY_CONST1 + "'>"
và đôi khi tôi phải nhớ gọi
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
dẫn đến lỗi, vì vậy tôi không làm điều đó nữa. Trên thực tế, tôi không ghi đè bất kỳ phương thức nào trên Enum bởi vì nếu bạn ném chúng xung quanh để có đủ mã khách hàng, cuối cùng bạn sẽ phá vỡ sự mong đợi của ai đó.
Làm cho tên phương pháp mới của riêng mình, như public String text()
hoặc toEnglish()
hoặc bất cứ điều gì.
Đây là một chức năng trợ giúp nhỏ có thể giúp bạn tiết kiệm một số thao tác gõ nếu bạn có nhiều enum như trên:
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();
}
}
Thật dễ dàng để gọi .toUpperCase () hoặc .toLowerCase () nhưng việc lấy lại trường hợp hỗn hợp có thể khó khăn. Hãy xem xét màu sắc, "bleu de France." Pháp luôn được viết hoa, vì vậy bạn có thể muốn thêm phương thức textLower () vào enum của mình nếu bạn gặp phải điều đó. Khi bạn sử dụng văn bản này ở đầu câu, so với giữa câu, so với trong tiêu đề, bạn có thể thấy một toString()
phương thức duy nhất sẽ bị thiếu. Và điều đó thậm chí không chạm vào các ký tự không hợp lệ trong các mã định danh Java hoặc gây khó chịu vì chúng không được thể hiện trên bàn phím tiêu chuẩn hoặc các ký tự không có vỏ (Kanji, v.v.).
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);
}
}
Không quá khó để sử dụng đúng cách:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Hy vọng rằng điều đó cũng chứng minh tại sao sử dụng các giá trị enum hỗn hợp cũng sẽ làm bạn thất vọng. Một lý do cuối cùng để giữ tất cả các mũ có hằng số enum bên dưới là làm như vậy tuân theo Nguyên tắc tối thiểu ngạc nhiên. Mọi người mong đợi nó, vì vậy nếu bạn làm điều gì đó khác biệt, bạn sẽ luôn phải tự giải thích hoặc xử lý những người lạm dụng mã của bạn.