从类型对象列表中返回匹配对象

时间:2015-04-15 17:49:21

标签: java spring enums

是否有任何有效的方法可以根据其中的值返回类型的匹配对象?请考虑以下代码段 -

我有包含这两个Person对象的枚举。

   public enum PersonEnum {
      Tom(new PersonA("Thomas", 21)),
      Jim(new PersonB("James", 34));
   }

在我的代码中,当我收到请求时,它有一个包含人名和年龄的对象。是否有任何有效的方法可以将对象传递给枚举,从而为该人返回正确的枚举条目?例如,如果输入对象包含名称Thomas和21岁,那么我想返回PersonEnum.Tom。希望不要做if / else的东西。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

您可以按照以下方式实施:

    public enum PersonEnum {


    Tom(new PersonA("Thomas", 21)),
    Jim(new PersonB("James", 34));

    private final Person _person;

    /**
     * 
     */
    private PersonEnum(Person p) {
        _person = p;
    }

    public Person getPerson() {
        return _person;
    }

    //You can name it valueOf which is more verbose
    public static PersonEnum of(Person p) {

        if(p == null){
          return null;
        }            
        //TODO other checks if necessary

        PersonEnum result = null;
        for (PersonEnum e: values()) {
            if (p.equals(e.getPerson())) {
                result = e;
                break;
            }
        }
        return result;
    }


   }

此外,为Person对象实现 equals 然后 hashcode 会很有用。 我在循环中使用它。

答案 1 :(得分:1)

我不知道枚举在哪里有帮助。您可以在Person类中包含一组包含已创建实例的值。收到请求后,请获取年龄和姓名参数,然后致电exists以查看是否已创建此人,并且您已完成此操作。

public class Person {

    public static final Set<Person> set = new HashSet<>();

    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        set.add(this);
    }

    //equals and hashcode

    public static boolean exists(String name, int age) {
        return set.contains(new Person(name, age));
    }
}

如果您需要您可能创建的所有人物实例的子集,您可以自己填充该集合(并删除构造函数中的add调用),即:

public static final Set<Person> set = 
           new HashSet<>(Arrays.asList(new Person("Thomas", 21), 
                                       new Person("James", 34)));

答案 2 :(得分:0)

无论如何你都需要编写if / else东西,因为你需要编写一个包装器来理解“使用反射从类中获取常量字段名称和年龄并尝试将其与枚举“例如。

在每个Java枚举中都有一个方法valueOf(String s),它返回一个枚举实例,其名称与提供的字符串相同。使用它你可以只通过名称来获取你的实例,但是Java中没有其他方法来阻止if / else(或者某些反射机制)。

P.S。:在Scala中有案例类。

答案 3 :(得分:0)

我不确定你为什么需要两个不同的课程。但无论如何你可以做下一个:

enum PersonEnum {

    Tom(new Person("Thomas", 21)),
    Jim(new Person("James", 34));

    private final Person person;

    PersonEnum(Person person) {
        this.person = person;
    }

    public static PersonEnum valueOf(Person person) {
        for (PersonEnum value : PersonEnum.values()) {
            if (value.person.equals(person)) {
                return value;
            }
        }
        return null;
    }
}

确保在Person类中实现equals(),比较年龄和名称。拥有hashCode()也很有用。经典实施将是

public class Person {
    private final String age;
    private final String value;

    public Person(String age, String value) {
        this.age = age;
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Person other = (Person) obj;
        if (!Objects.equals(this.age, other.age)) {
            return false;
        }
        if (!Objects.equals(this.value, other.value)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 79 * hash + Objects.hashCode(this.age);
        hash = 79 * hash + Objects.hashCode(this.value);
        return hash;
    }
}