java - 如何通过 it 属性为枚举设置一些值

标签 java enums setter

我有内部枚举类:

public class Apartment implements Comparable<Apartment> {
    // more properties
    private StarRating rating;
    private SleepPlaces sleepPlaces;


    public enum StarRating {
        TWO_STARS("two stars"), THREE_STARS("three stars"), FOUR_STARS("four stars"), FIVE_STARS("five stars");

        private String description;

        private StarRating(String description) {
            this.description = description;
        }
        public String getDescription() {
            return description;
        }
    }

    public void setRating(StarRating rating) {
        this.rating = rating;
    }

正如您所看到的,它具有 description 值,该值描述了此枚举元素。

我需要从 jsp 选择字段设置枚举。跳过一些 jsp 代码,我们有一些字符串值,如 - 两颗星,由用户选择。

我想将其设置为 Apartment 对象,但我无法使用枚举的 valueOf() 来做到这一点。它抛出IllegalArgumentException

一些示例:

public class Test {
    public static void main(String[] args) {
        Apartment app = new Apartment();

        String rating2 = "TWO_STARS";
        app.setRating(Enum.valueOf(Apartment.StarRating.class, rating2));
        System.out.println("here is rating: " + app.getRating());

        String rating = "two stars";
        app.setRating(Enum.valueOf(Apartment.StarRating.class, rating));
        System.out.println("here is rating: " + app.getRating());

    }
}

输出:

here is rating: TWO_STARS
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.lelyak.model.Apartment.StarRating.two stars
    at java.lang.Enum.valueOf(Enum.java:236)
    at com.lelyak.application.Test.main(Test.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

如何实现评级值的第二种变体?有什么建议吗?

如何通过枚举值设置枚举元素?

解决方案:

向枚举添加静态方法:

    public static StarRating getByDescription(String description){
        if(description != null){
            for(StarRating sr : StarRating.values()){
                if(description.equalsIgnoreCase(sr.description)){
                    return sr;
                }
            }
        }
        return null;
    }

最佳答案

我认为您实际上要问的是如何通过description设置枚举。没有内置构造可以让您执行此操作,但您可以向枚举添加静态方法:

public static StarRating getByDescription(String description){
    if(description == null){
        return null;
    }
    for(StarRating sr : StarRating.values()){
        if(description.equals(sr.description)){
            return sr;
        }
    }
    return null;
}

关于java - 如何通过 it 属性为枚举设置一些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22115572/

相关文章:

json - "let JSON"在 Alamofire/Swift 中如何工作

Java射击游戏删除子弹对象

java - 如何使用 JPA 和 Hibernate 映射 PostgreSQL 枚举

java - 有什么方法可以从 Java 使用 Windows 7 多点触控吗?

java - Java 中的线程安全访问枚举

javascript - 使用数组表示法了解何时将属性设置为对象

java - 调用使用 AspectJ 注释的字段的 setter

Java 练习...需要不使用 getter 和 setter 的帮助

java - 跨 jvms 的对象的对象 ID?

Java : when do you want to customize the serialization process?