web-dev-qa-db-ja.com

Enum値を文字列リテラルとして使用する

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

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

その後、Mode.mode1を使ってその文字列表現をmode1として返すことができます。 Mode.mode1.toString()を呼び出し続ける必要はありません。

338
Larry

できません。ここには4つの選択肢があると思います。 4つすべてが解決策を提供しますが、わずかに異なるアプローチを使用します...

オプション1: enumに組み込みのname()を使用します。特別な命名形式が不要な場合は、これで十分です。

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

オプション2: より多くの制御が必要な場合は、オーバーライドプロパティを列挙に追加してください

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: 列挙の代わりに静的な決勝を使う:

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";  
}
580
Michael J. Lee

すべての列挙には、name()メソッドとvalueOf(String)メソッドの両方があります。前者は列挙型の文字列名を返し、後者は名前が文字列のenum値を返します。これはあなたが探しているもののようなものですか?

String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);

Enum自体には静的なvalueOf(Class、String)もありますので、それを使うこともできます。

Modes mode = Enum.valueOf(Modes.class, name);
450
Ryan Stewart

各列挙値に対してtoString()メソッドをオーバーライドできます。

例:

public enum Country {

  DE {
    @Override
    public String toString() {
      return "Germany";
    }
  },
  IT {
    @Override
    public String toString() {
      return "Italy";
    }
  },
  US {
    @Override
    public String toString() {
      return "United States";
    }
  }

}

使用法:

public static void main(String[] args) {
  System.out.println(Country.DE); // Germany
  System.out.println(Country.IT); // Italy
  System.out.println(Country.US); // United States
}
71

Benny Neugebauerが述べたように、toString()を上書きすることができます。しかし、代わりに各列挙型フィールドのtoStringを上書きします。

public enum Country{
    SPAIN("España"),
    ITALY("Italia"),
    PORTUGAL("Portugal");


    private String value;

    Country(final String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return this.getValue();
    }
}

すべてのフィールドを取得したり、それらすべてを印刷したりするための静的メソッドを追加することもできます。単純にgetValueを呼び出して、各Enum項目に関連付けられた文字列を取得します。

29
iberodev

mode1.name()またはString.valueOf(mode1)。それ以上は良くない、怖い

26
public enum Modes {
  MODE1("Mode1"),
  MODE2("Mode2"),
  MODE3("Mode3");

 private String value;
 public String getValue() {
    return value;
   }
 private Modes(String value) {
  this.value = value;
 } 
}

enumから文字列として値を取得したいところならどこでもあなたは以下のような呼び出しをすることができます。

Modes.MODE1.getvalue();

これは文字列として "Mode1"を返します。

20
vamsi

あなたはMode.mode1.name()を使うことができますが、しばしばこれをする必要はありません。

Mode mode =
System.out.println("The mode is "+mode);
6
Peter Lawrey

私の列挙型では、1つのStringが割り当てられていると考えるのはあまり好きではありません。これが私が列挙型にtoString()メソッドを実装する方法です。

enum Animal
{
    DOG, CAT, BIRD;
    public String toString(){
        switch (this) {
            case DOG: return "Dog";
            case CAT: return "Cat";
            case BIRD: return "Bird";
        }
        return null;
    }
}
6
Ethan

私の知る限りでは、名前をつける唯一の方法はそれだろう

Mode.mode1.name();

あなたが本当にそれをこのように必要とするなら、しかしながら、あなたはそうすることができました:

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");

    private String name;       

    private Modes(String s) {
        name = s;
    }
}
5
Jake Roussel

あなたは単に使用することができます:

""+ Modes.mode1
5
Buddy
package com.common.test;

public  enum Days {


    monday(1,"Monday"),tuesday(2,"Tuesday"),wednesday(3,"Wednesday"),
    thrusday(4,"Thrusday"),friday(5,"Friday"),saturday(6,"Saturday"),sunday(7,"Sunday");

    private int id;
    private String desc;


    Days(int id,String desc){
        this.id=id;
        this.desc=desc;
    }

    public static String getDay(int id){

        for (Days day : Days.values()) {
            if (day.getId() == id) {
                return day.getDesc();
            }
        }
        return null;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }



};
3
user4772709

Enumはちょっと特別なクラスです。 Enumは追加のフィールドを保存したり、メソッドを実装したりすることができます。

public enum Modes {
    mode1('a'),
    mode2('b'),
    mode3('c'),
    ;
    char c;

    private Modes(char c) {
        this.c = c;
    }
    public char character() {
        return c;
    }
}

今、あなたは言うことができます:

System.out.println(Modes.mode1.character())

そして出力を見てください:a

3
AlexR
public enum Environment
{
    PROD("https://prod.domain.com:1088/"),
    SIT("https://sit.domain.com:2019/"),
    CIT("https://cit.domain.com:8080/"),
    DEV("https://dev.domain.com:21323/");

    private String url;

    Environment(String envUrl) {
        this.url = envUrl;
    }

    public String getUrl() {
        return url;
    }
}

String prodUrl = Environment.PROD.getUrl();

それは印刷されます:

https://prod.domain.com:1088/

enum文字列定数 用のこの設計は、ほとんどの場合に機能します。

2
lokesh

このメソッドはどんなenumでも動作するはずです。

public enum MyEnum {
    VALUE1,
    VALUE2,
    VALUE3;

    public int getValue() {
        return this.ordinal();
    }

    public static DataType forValue(int value) {
        return values()[value];
    }

    public String toString() {
        return forValue(getValue()).name();
    }
}
2
Caner

あなたの問題に対する私の解決策!

import Java.util.HashMap;
import Java.util.Map;

public enum MapEnumSample {
    Mustang("One of the fastest cars in the world!"), 
    Mercedes("One of the most beautiful cars in the world!"), 
    Ferrari("Ferrari or Mercedes, which one is the best?");

    private final String description;
    private static Map<String, String> enumMap;

    private MapEnumSample(String description) {
        this.description = description;
    }

    public String getEnumValue() {
        return description;
    }

    public static String getEnumKey(String name) {
        if (enumMap == null) {
            initializeMap();
        }
        return enumMap.get(name);
    }

    private static Map<String, String> initializeMap() {
        enumMap = new HashMap<String, String>();
        for (MapEnumSample access : MapEnumSample.values()) {
            enumMap.put(access.getEnumValue(), access.toString());
        }
        return enumMap;
    }

    public static void main(String[] args) {

        // getting value from Description
        System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));

        // getting value from Constant
        System.out.println(MapEnumSample.Mustang.getEnumValue());

        System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!"));
        System.out.println(MapEnumSample.Mercedes.getEnumValue());

        // doesnt exist in Enum
        System.out.println("Mustang or Mercedes, which one is the best?");
        System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
                + MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!.");

        // exists in Enum
        System.out.println("Ferrari or Mercedes, wich one is the best?");
        System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
                + MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!");

    }
}
Modes.MODE1.toString();

インターフェース、クラス、またはゲッターセッターを作成せずに簡単な方法です。

1
Prateek Mehta

私はこれが型エラーを防ぐためにもっと簡単であることがわかりました:

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

    String str;

    Modes(){
        this.str = super.name();
    }

    @Override
    @NonNull
    public String toString() {
        return str;
    }

ただし、log/printlnでStringを使用する必要があるとき、またはJavaがtoString()メソッドを自動的にコンパイルするときはいつでも、これは機能する可能性がありますが、このようなコード行では - >

// sample method that require (string,value)
intent.putExtra(Modes.mode1 ,shareElement.getMode()); // Java error
// first argument enum does not return value

代わりに上記のようにあなたはまだ列挙を拡張して使用する必要があります .name() このような場合には:

intent.putExtra(Modes.mode1.name() ,shareElement.getMode()); 
0
ItzikH

これを試すことができます:

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

    public String toString(){
        switch(this) {
            case some-really-long-string:
                return "some-really-long-string";
            case mode2:
                return "mode2";
            default: return "undefined";
        }
    }

}

0
Kamil Naja

何度も試した結果、私はこの解決策を思いついた。

public static enum Operation {

    Addition, Subtraction, Multiplication, Division,;

    public String getUserFriendlyString() {
        if (this==Addition) {
            return " + ";
        } else if (this==Subtraction) {
            return " - ";
        } else if (this==Multiplication) {
            return " * ";
        } else if (this==Division) {
            return " / ";
        }
        return "undefined";
       }
}
0