135

私の値enumはスペースが必要な単語ですが、列挙型の値にはスペースを含めることができないため、すべてがまとめられています。toString()オーバーライドして、指示した場所にこれらのスペースを追加したいと思います。

valueOf()また、スペースを追加したのと同じ文字列で使用するときに、列挙型が正しい列挙型を提供するようにします。

例えば:

public enum RandomEnum
{
     StartHere,
     StopHere
}

値が文字列toString()を返す呼び出し。同じ文字列()を呼び出すと、列挙値が返されます。RandomEnumStartHere"Start Here"valueof()"Start Here"StartHere

これどうやってするの?

4

7 に答える 7

220

このコードを試すことができます。メソッドをオーバーライドできないため、必要な値を返す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();
    }
}
于 2012-03-12T06:08:44.003 に答える
21

これを試してみてください、しかし私はそれがどこでもうまくいくかどうかわかりません:)

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) {}
    }
}
于 2014-02-20T09:21:54.957 に答える
15

文字列を列挙型定数にマップする静的マップを列挙型で使用できます。'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からのものであり、このような場合には絶対にお勧めします。


編集-コメントごとに:

  1. このソリューションは、割り当てられた各文字列値が一意であり、nullではないことを前提としています。列挙型の作成者がこれを制御でき、文字列が一意のnull以外の列挙型値に対応していることを考えると、これは安全な制限のようです。
  2. 質問で求められたように「toSTring()」メソッドを追加しました
于 2012-11-26T20:17:19.297 に答える
14

Java 8の実装はどうですか?(nullはデフォルトの列挙型に置き換えることができます)

public static RandomEnum getEnum(String value) {
    return Arrays.stream(RandomEnum.values()).filter(m -> m.value.equals(value)).findAny().orElse(null);
}

または、次を使用できます。

...findAny().orElseThrow(NotFoundException::new);
于 2015-10-06T16:49:39.210 に答える
2

valueOf( "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
于 2012-03-12T06:00:39.483 に答える
2

以下は、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);
}
于 2012-06-27T09:20:26.833 に答える
2

列挙型にこれを実装するオプションがまだあります:

public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name){...}
于 2017-11-24T17:16:54.617 に答える