是否有任何有效的方法可以根据其中的值返回类型的匹配对象?请考虑以下代码段 -
我有包含这两个Person对象的枚举。
public enum PersonEnum {
Tom(new PersonA("Thomas", 21)),
Jim(new PersonB("James", 34));
}
在我的代码中,当我收到请求时,它有一个包含人名和年龄的对象。是否有任何有效的方法可以将对象传递给枚举,从而为该人返回正确的枚举条目?例如,如果输入对象包含名称Thomas和21岁,那么我想返回PersonEnum.Tom。希望不要做if / else的东西。有什么建议吗?
答案 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;
}
}