Javaコードとデータベースまたはクライアントアプリの間で列挙型を送信すると、列挙型の値を文字列として読み書きすることがよくあります。 toString()
文字列を連結するときに暗黙的に呼び出されます。一部の列挙型でtoString()をオーバーライドすると、時々私は単に
"<input type='checkbox' value='" + MY_CONST1 + "'>"
そして時々私は電話することを覚えなければなりませんでした
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
エラーが発生したので、もうそれはしません。実は、私はオーバーライドしない任意のあなたは十分なクライアントコードにそれらを周りに投げるならば、あなたは最終的に誰かの期待を破るだろうから列挙のメソッドを。
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」という色を考えてみましょう。フランスは常に大文字なので、それに遭遇した場合は、enumにtextLower()メソッドを追加することをお勧めします。このテキストを文の最初、文の途中、またはタイトルで使用すると、単一の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値を使用すると失望する理由も示されます。アンダースコアの列挙型定数をすべて大文字にしておく最後の理由の1つは、最小の驚きの原則に従うことです。人々はそれを期待しているので、何か違うことをすると、常に自分自身を説明したり、コードを悪用する人々に対処したりする必要があります。