enum
の値はスペースが必要な単語ですが、enumは値にスペースを含めることができないため、すべてがまとめられます。 toString()
をオーバーライドして、指示した場所にこれらのスペースを追加します。
スペースを追加したのと同じ文字列でvalueOf()
を使用するときに、enumに正しいenumを提供することも必要です。
例えば:
public enum RandomEnum
{
StartHere,
StopHere
}
値がRandomEnum
であるStartHere
でtoString()
を呼び出すと、文字列"Start Here"
が返されます。同じ文字列("Start Here"
)でvalueof()
を呼び出すと、列挙値StartHere
が返されます。
これどうやってするの?
このコードを試すことができます。 valueOf
メソッドをオーバーライドできないため、必要な値を返すカスタムメソッド(以下のサンプルコードではgetEnum
)を定義し、代わりにこのメソッドを使用するようにクライアントを変更する必要があります。
public enum RandomEnum {
StartHere("Start Here"),
StopHere("Stop Here");
private String value;
RandomEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
public static RandomEnum getEnum(String value) {
for(RandomEnum v : values())
if(v.getValue().equalsIgnoreCase(value)) return v;
throw new IllegalArgumentException();
}
}
これを試してみてください、しかし、私はそれがすべての場所でうまくいくと確信していません:)
public enum MyEnum {
A("Start There"),
B("Start Here");
MyEnum(String name) {
try {
Field fieldName = getClass().getSuperclass().getDeclaredField("name");
fieldName.setAccessible(true);
fieldName.set(this, name);
fieldName.setAccessible(false);
} catch (Exception e) {}
}
}
文字列を列挙型定数にマップする列挙型の静的マップを使用できます。 'getEnum'静的メソッドで使用します。これにより、文字列値から列挙型を取得するたびに列挙型を反復処理する必要がなくなります。
public enum RandomEnum {
StartHere("Start Here"),
StopHere("Stop Here");
private final String strVal;
private RandomEnum(String strVal) {
this.strVal = strVal;
}
public static RandomEnum getEnum(String strVal) {
if(!strValMap.containsKey(strVal)) {
throw new IllegalArgumentException("Unknown String Value: " + strVal);
}
return strValMap.get(strVal);
}
private static final Map<String, RandomEnum> strValMap;
static {
final Map<String, RandomEnum> tmpMap = Maps.newHashMap();
for(final RandomEnum en : RandomEnum.values()) {
tmpMap.put(en.strVal, en);
}
strValMap = ImmutableMap.copyOf(tmpMap);
}
@Override
public String toString() {
return strVal;
}
}
マップの静的初期化が列挙定数の宣言の下で行われることを確認してください。
ところで-その「ImmutableMap」タイプはGoogle guava APIからのものであり、このような場合には必ずお勧めします。
編集-コメントごと:
Java 8実装はどうですか? (nullはデフォルトのEnumに置き換えることができます)
public static RandomEnum getEnum(String value) {
List<RandomEnum> list = Arrays.asList(RandomEnum.values());
return list.stream().filter(m -> m.value.equals(value)).findAny().orElse(null);
}
または、次を使用できます。
...findAny().orElseThrow(NotFoundException::new);
私は、あなたが値Of( "Start Here")を得ることがうまくいくとは思わない。しかし、スペースに関しては...以下を試してください...
static private enum RandomEnum {
R("Start There"),
G("Start Here");
String value;
RandomEnum(String s) {
value = s;
}
}
System.out.println(RandomEnum.G.value);
System.out.println(RandomEnum.valueOf("G").value);
Start Here
Start Here
これを列挙に実装するオプションがまだあります:
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name){...}
以下は、valueOf()のニース汎用代替です
public static RandomEnum getEnum(String value) {
for (RandomEnum re : RandomEnum.values()) {
if (re.description.compareTo(value) == 0) {
return re;
}
}
throw new IllegalArgumentException("Invalid RandomEnum value: " + value);
}