toString()をオーバーライドしたenumの文字列結果をenumに戻す方法は?
-
04-07-2019 - |
質問
次のJava列挙型を指定:
public enum AgeRange {
A18TO23 {
public String toString() {
return "18 - 23";
}
},
A24TO29 {
public String toString() {
return "24 - 29";
}
},
A30TO35 {
public String toString() {
return "30 - 35";
}
},
}
「18-23」の文字列値を変換する方法はありますか?対応する列挙値、つまりAgeRange.A18TO23?
ありがとう!
解決
これを行うための最良かつ最も簡単な方法は次のとおりです。
public enum AgeRange {
A18TO23 ("18-23"),
A24TO29 ("24-29"),
A30TO35("30-35");
private String value;
AgeRange(String value){
this.value = value;
}
public String toString(){
return value;
}
public static AgeRange getByValue(String value){
for (final AgeRange element : EnumSet.allOf(AgeRange.class)) {
if (element.toString().equals(value)) {
return element;
}
}
return null;
}
}
次に、 String
入力を含む getByValue()
メソッドを呼び出すだけです。
他のヒント
文字列から値へのマップはいつでも作成できます-静的に作成するため、返された文字列が時間とともに変わらないと仮定して、一度だけマップする必要があります。私が知っている限り、何も組み込まれていません。
有効なjava(2nd ed)アイテム30によれば、可能性があります(ループよりはるかに高速です)
public enum AgeRange {
A18TO23("18-23"),
A24TO29("24-29"),
A30TO35("30-35");
private final String value;
AgeRange(String value){
this.value = value;
}
@Override public String toString(){
return value;
}
private static final Map<String, AgeRange> stringToEnum =
new HashMap<String, AgeRange>();
static {
for (AgeRange r : values()) {
stringToEnum.put(r.toString(), r);
}
}
public static AgeRange getByValue(String value){
return stringToEnum.get(value);
}
}
for (AgeRange ar: EnumSet.allOf(AgeRange)) {
if (ar.toString().equals(inString)) {
myAnswer = ar;
break;
}
}
またはそのようなものですか?入力するだけで、コンパイラを実行していません。タイプミスを許す(コメント)...
またはこのようなロジックを使用して、マップを1回作成します。実行時の反復を避けます。いいね、ジョン。
クラスは&quot; toString()&quot;をオーバーライドします-したがって、逆の操作を行うには、 valueOf()
をオーバーライドして、 toString()
の出力をEnum値に戻す必要があります。
public enum AgeRange {
A18TO23 {
public String toString() {
return "18 - 23";
}
public AgeRange valueOf (Class enumClass, String name) {
return A18T023
}
},
.
.
.
}
購入者の注意-未コンパイルおよび未テスト...
toString()
および valueOf()
のメカニズムは、 API
次のようなものを試すことができますか?
static AgeRange fromString(String range) {
for (AgeRange ageRange : values()) {
if (range.equals(ageRange.toString())) {
return ageRange;
}
}
return null;
}
または、他の人が示唆したように、キャッシュ手法を使用します:
private static Map<String, AgeRange> map;
private static synchronized void registerAgeRange(AgeRange ageRange) {
if (map == null) {
map = new HashMap<String, AgeRange>();
}
map.put(ageRange.toString(), ageRange);
}
AgeRange() {
registerAgeRange(this);
}
static AgeRange fromString(String range) {
return map.get(range);
}
所属していません StackOverflow