1. ホーム

[解決済み】Enum値をStringリテラルとして使用する場合

2022-03-24 07:20:44

質問

Enumに格納された値をStringリテラルとして使用する最も良い方法は何ですか? 例えば

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3
}

そして、後で Mode.mode1 という文字列表現を返します。 mode1 . を何度も呼び出すことなく Mode.mode1.toString() .

解決方法は?

無理です。ここには4つの選択肢があると思います。4つとも解決策を提示していますが、少し違ったアプローチで...。

オプション1 を使用します。 name() を列挙しています。特別な命名形式を必要としないのであれば、これは全く問題ないでしょう。

    String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.

オプション2 もっと制御したい場合は、enumにオーバーライドプロパティを追加します。

public enum Modes {
    mode1 ("Fancy Mode 1"),
    mode2 ("Fancy Mode 2"),
    mode3 ("Fancy Mode 3");

    private final String name;       

    private Modes(String s) {
        name = s;
    }

    public boolean equalsName(String otherName) {
        // (otherName == null) check is not needed because name.equals(null) returns false 
        return name.equals(otherName);
    }

    public String toString() {
       return this.name;
    }
}

オプション3 enumの代わりにstatic finalsを使用します。

public final class Modes {

    public static final String MODE_1 = "Fancy Mode 1";
    public static final String MODE_2 = "Fancy Mode 2";
    public static final String MODE_3 = "Fancy Mode 3";

    private Modes() { }
}

オプション4 インターフェースは、すべてのフィールドが public、static、final である。

public interface Modes {

    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}