Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举与If-else_Java - Fatal编程技术网

Java 枚举与If-else

Java 枚举与If-else,java,Java,我有一个需求,我需要从事件列表中构建一个employee对象,如下所示。目前我已经编写了如下代码,但QE给出了一条评论,说可能使用枚举而不是多个if-else。 有人能建议我如何使用enum实现这一点吗 Employee e= new Employee(); for(Event event:events){ if("empid".equals(event.getName()) e.setEmployeeId(event.getvalue()); else if("empname".equa

我有一个需求,我需要从事件列表中构建一个employee对象,如下所示。目前我已经编写了如下代码,但QE给出了一条评论,说可能使用枚举而不是多个if-else。 有人能建议我如何使用enum实现这一点吗

Employee e= new Employee();
for(Event event:events){
if("empid".equals(event.getName())
   e.setEmployeeId(event.getvalue());
else if("empname".equals(event.getName())
   e.setEmployeeName(event.getvalue());
else if("empsal".equals(event.getName())
   e.setEmployeeSal(event.getvalue());
else if("empdob".equals(event.getName())
   e.setEmployeeDOB(event.getvalue());
else if("emprole".equals(event.getName())
   e.setEmployeeRole(event.getvalue());
}

使用以下代码创建枚举

public enum  EMPLOYEE_FIELDS {EMPID, EMPNAME,EMPSAL, EMPDOB, EMPROLE};

EMPLOYEE_FIELDS empField = EMPLOYEE_FIELDS.valueOf(event.getName().toUpperCase());

 switch(empField ){
    case EMPID:
        //do something here
        break;
    case EMPNAME:
        //do something here
        break;
    // other cases.
    // other cases.
    // other cases.
    default:
            //do something here
 }

希望这有帮助

我建议您将处理事件的逻辑移到
enum
中。如果您使用的是Java 8,那么它看起来像:

enum EmployeeField {
    ID("empid", Employee::setEmployeeID),
    NAME("empname", Employee::setEmployeeName),
    SALARY("empsalary", Employee::setEmployeeSalary),
    ...

    private final String key;
    private final BiConsumer<Employee, String> valueSetter;

    EmployeeField(String key, BiConsumer<Employee, String> valueSetter) {
        this.key = key;
        this.valueSetter = valueSetter;
    }

    public void setEmployeeField(Employee employee, String value) {
        valueSetter.accept(employee, value);
    }

    public static EmployeeField getFieldForKey(String key) {
        return Arrays.stream(values[])
            .filter(ef -> ef.key.equals(key))
            .findAny()
            .orElseThrow(new IllegalArgumentException("No employee field " + key));
    }
}
这还意味着,有关employee字段的所有信息(包括如何设置employee值)都封装在enum中,可以轻松更改或扩展,而不会影响其他任何内容


请注意,在Java8之前,您可以做类似的事情,而不必使用lambdas,但它并不像匿名接口实例需要显式化那样优雅(在我看来),这使得代码更加复杂。或者,您可以覆盖每个枚举成员的方法,这(在我看来)更难看。

如果您控制
事件的开发,我相信您的QE所说的是用
枚举替换事件名称(这是一个合理的设计,因为您已经决定了事件的可能类型)。但是,如果
Event
的设计超出了您的控制范围,或者您无法使用
Event
的子类(例如,制作
EmployeeEvent
),那么请忽略我要说的内容)

i、 e

然后您的代码可以简化为

Employee e= new Employee();
for (Event event: events) {
    switch (event.getType()) {
        case EMP_ID:
            e.setEmployeeId(event.getvalue());
            break;
        case EMP_NAME:
            e.setEmployeeName(event.getvalue());
            break;
        ....
    }
}
您甚至可以使用地图(与另一个答案的想法类似)预设针对每种事件类型要执行的操作


嗯。基于事件名称(假设您使用的是java 7+),为empname、empsal等和
开关创建枚举。删除凌乱的
if-else
子句,由于您不扫描所有案例,切换将更快。谢谢您的快速回复。你能发布一个关于如何做到这一点的示例片段吗。。。另外,供参考,我使用的是Java 6而不是7检查问题。您可以在同一个页面上查看示例代码段的以下答案。这将如何工作?。字符串“empname”、“empsal”等应该映射到enum中。请发布正确的答案-如果您需要enum是empname,empsal让您的代码工作,然后在您的答案中这样做!在枚举中所做的更改以匹配问题的strings@barakmanos此问题询问使用带有枚举的字符串的多个if-else的替代方法。我已尝试在此解决方案中定义枚举的用法。eeek。我真的不喜欢覆盖枚举名称以匹配事件键的样式。(在我看来)这是一个相当脆弱的方法。最好在枚举中包含键。有关java 8之前版本的可能性,请参见(
setEmployeeField
作为抽象方法)@RC这是我在上一段中提到的方法。我想我们都同意,在Java8中它要整洁得多!我只是为了举例说明而用链接发表了评论;)@谢谢。很多人似乎还是在Java8之前。现在我已经习惯了lambda和streams,我无法想象没有它们:-)虽然解决方案是可行的,但如果您仔细看看,在这里使用
enum
几乎没有意义。您唯一的“优势”是只需访问
即可获得可用“字段”列表,而您实际上不需要
枚举
enum EventType {
    EMP_ID,
    EMP_NAME,
    ....
}


interface Event {
    EventType getType();   // instead of getName() which returns a String
}
Employee e= new Employee();
for (Event event: events) {
    switch (event.getType()) {
        case EMP_ID:
            e.setEmployeeId(event.getvalue());
            break;
        case EMP_NAME:
            e.setEmployeeName(event.getvalue());
            break;
        ....
    }
}
Map<EventType, BiConsumer<Employee, String>> eventActions = new EnumMap<>();
eventActions.put(EventType.EMPLOYEE_ID, Employee::setEmployeeID);
eventActions.put(EventType.EMPLOYEE_NAME, Employee::setEmployeeName);
Employee e= new Employee();
for (Event event: events) {
    eventActions.get(event.getType()).accept(e, event.getValue()));
}