在Java中将字符串转换为枚举

在Java中将字符串转换为枚举,java,android,enums,Java,Android,Enums,我已定义此枚举: public enum UsageType { START("start"), PAUSE("pause"), RESUME("resume"), STOP("stop"), DESTROY("destroy"); private final String mType; private UsageType(String type) { mType = type; } /**

我已定义此枚举:

public enum UsageType {

    START("start"),
    PAUSE("pause"),
    RESUME("resume"),
    STOP("stop"),
    DESTROY("destroy");

    private final String mType;

    private UsageType(String type) {
        mType = type;
    }

    /**
     * Get the string representation of the UsageType
     * @return string representation of the UsageType
     */
    public String getAsText() {
        return mType;
    }
}
在另一个类中,我有一个接受字符串的constractor,我想用该字符串创建一个枚举:

public class AppUsage {

    private String mActivityName;
    private String mFormattedTime;
    private UsageType mUsageType;

    public AppUsage(String activityName, String formattedTime, String usageType) {
        mActivityName = activityName;
        mFormattedTime = formattedTime;
        mUsageType =  mUsageType.valueOf(usageType); //HERE STRING TO ENUM!
    }

    //Setters and Getters....
以下是我得到的错误:

java.lang.IllegalArgumentException: start is not a constant in com.embedonix.mobilehealth.serverwork.usage.UsageType
        at java.lang.Enum.valueOf(Enum.java:198)
        at com.embedonix.mobilehealth.serverwork.usage.UsageType.valueOf(UsageType.java:6)

请尝试
UsageType.valueOf(UsageType.toUpperCase())
。使用该方法时,字符串应与常量名称(
START
)匹配,并且大小写很重要

请注意,我使用的是枚举名
UsageType
,因为
valueOf
是一个静态方法。因此,您应该需要一个实例


另外,请注意,
valueOf
方法在不存在同名常量的情况下抛出
illegargumentexception
,运行时异常。

请尝试
UsageType.valueOf(UsageType.toUpperCase())
。使用该方法时,字符串应与常量名称(
START
)匹配,并且大小写很重要

请注意,我使用的是枚举名
UsageType
,因为
valueOf
是一个静态方法。因此,您应该需要一个实例


另外,请注意,
valueOf
方法在不存在同名常量的情况下抛出
IllegalArgumentException
,运行时异常。

如果使用常量名称类型(大写),而不是通过构造函数上的参数传递的内部名称

String str = "START"; // as example...could be "PAUSE", or "DESTROY", etc.
UsageType type = UsageType.valueOf(str);
删除此构造函数参数..它没用。简单地说:

public enum UsageType {
   START,
   PAUSE,
   RESUME,
   STOP,
   DESTROY;
}

对于getAsText(),如果使用常量名称类型(大写),而不是通过构造函数上的参数传递的内部名称,只需使用内置的UsageType.name()

String str = "START"; // as example...could be "PAUSE", or "DESTROY", etc.
UsageType type = UsageType.valueOf(str);
删除此构造函数参数..它没用。简单地说:

public enum UsageType {
   START,
   PAUSE,
   RESUME,
   STOP,
   DESTROY;
}
对于getAsText()只需使用内置的UsageType.name()

这是怎么回事

    public AppUsage(String activityName, String formattedTime, String usageType) {
      mActivityName = activityName;
      mFormattedTime = formattedTime;
      for(UsageType type : UsageType.values())
        {
          if(type.getAsText().equals(usageType))
            mUsageType = type;
        }
      }
这个怎么样

    public AppUsage(String activityName, String formattedTime, String usageType) {
      mActivityName = activityName;
      mFormattedTime = formattedTime;
      for(UsageType type : UsageType.values())
        {
          if(type.getAsText().equals(usageType))
            mUsageType = type;
        }
      }

当我想将字符串转换为枚举时,我总是使用查找映射 将此添加到您的枚举中

private static final Map<String, UsageType> lookup = new HashMap<String, UsageType>();
    static {
        for (final UsageType s : EnumSet.allOf(UsageType.class)) {
            lookup.put(s.getAsText(), s);
        }
    }
    static public UsageType fromString(final String name) {
        return lookup.get(name);
    }
private static final Map lookup=new HashMap();
静止的{
for(最终UsageType s:EnumSet.allOf(UsageType.class)){
lookup.put(s.getAsText(),s);
}
}
静态公共UsageType fromString(最终字符串名称){
返回lookup.get(name);
}

现在要将字符串转换为enum,您需要做的就是
UsageType.fromString(“someString”)

当我想将字符串转换为枚举时,我总是使用查找映射 将此添加到您的枚举中

private static final Map<String, UsageType> lookup = new HashMap<String, UsageType>();
    static {
        for (final UsageType s : EnumSet.allOf(UsageType.class)) {
            lookup.put(s.getAsText(), s);
        }
    }
    static public UsageType fromString(final String name) {
        return lookup.get(name);
    }
private static final Map lookup=new HashMap();
静止的{
for(最终UsageType s:EnumSet.allOf(UsageType.class)){
lookup.put(s.getAsText(),s);
}
}
静态公共UsageType fromString(最终字符串名称){
返回lookup.get(name);
}

现在要将字符串转换为enum,您需要做的就是
UsageType.fromString(“someString”)

我观察到的是基于枚举的,我们可以获得值,但不能通过传递值来获得枚举名称。 i、 试试这个,对我来说很好。希望对你有帮助

public enum UsageType {    
    START("start"),
    PAUSE("pause"),
    RESUME("resume"),
    STOP("stop"),
    DESTROY("destroy");

    private final String mType;

    UsageType(String type) {
        mType = type;
    }


    public String getAsText() {
        return mType;
    }

}

public class AppUsage {

    private String mActivityName;
    private String mFormattedTime;
    public static UsageType mUsageType;

    public AppUsage(String activityName, String formattedTime, String usageType) {
        mActivityName = activityName;
        mFormattedTime = formattedTime;
        mUsageType =  UsageType.valueOf(usageType); //HERE STRING TO ENUM!
    }

    public String getmActivityName() {
        return mActivityName;
    }

    public void setmActivityName(String mActivityName) {
        this.mActivityName = mActivityName;
    }

    public String getmFormattedTime() {
        return mFormattedTime;
    }

    public void setmFormattedTime(String mFormattedTime) {
        this.mFormattedTime = mFormattedTime;
    }

    public UsageType getmUsageType() {
        return mUsageType;
    }

    public void setmUsageType(UsageType mUsageType) {
        AppUsage.mUsageType = mUsageType;
    }
 public static void main(String args[]){
//   AppUsage au=new AppUsage("a", "a","START");
     UsageType v[]=mUsageType.values();
     UsageType u=mUsageType.valueOf("START");
     System.out.println(u.getAsText());

 }
}

希望它可以解决您的问题

我所观察到的是基于枚举的,我们可以得到值,但不能通过传递值来获得枚举名。 i、 试试这个,对我来说很好。希望对你有帮助

public enum UsageType {    
    START("start"),
    PAUSE("pause"),
    RESUME("resume"),
    STOP("stop"),
    DESTROY("destroy");

    private final String mType;

    UsageType(String type) {
        mType = type;
    }


    public String getAsText() {
        return mType;
    }

}

public class AppUsage {

    private String mActivityName;
    private String mFormattedTime;
    public static UsageType mUsageType;

    public AppUsage(String activityName, String formattedTime, String usageType) {
        mActivityName = activityName;
        mFormattedTime = formattedTime;
        mUsageType =  UsageType.valueOf(usageType); //HERE STRING TO ENUM!
    }

    public String getmActivityName() {
        return mActivityName;
    }

    public void setmActivityName(String mActivityName) {
        this.mActivityName = mActivityName;
    }

    public String getmFormattedTime() {
        return mFormattedTime;
    }

    public void setmFormattedTime(String mFormattedTime) {
        this.mFormattedTime = mFormattedTime;
    }

    public UsageType getmUsageType() {
        return mUsageType;
    }

    public void setmUsageType(UsageType mUsageType) {
        AppUsage.mUsageType = mUsageType;
    }
 public static void main(String args[]){
//   AppUsage au=new AppUsage("a", "a","START");
     UsageType v[]=mUsageType.values();
     UsageType u=mUsageType.valueOf("START");
     System.out.println(u.getAsText());

 }
}

希望它可以解决您的问题

除非您重写
toString
,否则不需要显式使用
UsageType.name()
。除非您重写
toString
,否则不需要显式使用
UsageType.name()