java - 枚举与 If-else

标签 java

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

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());
}

最佳答案

如果您控制着 Event 的开发,我相信您的 QE 所说的是用 enum 替换事件名称(这是一个理智的设计,因为您有已经决定了可能的事件类型)。但是,如果 Event 的设计超出您的控制范围,或者您无法使用 Event 的子类(例如,创建一个 EmployeeEvent), 然后忽略我要说的话)

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 (与另一个答案的想法类似)预设针对每种事件类型执行的操作

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()));
}

关于java - 枚举与 If-else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33407222/

相关文章:

java - 这段代码有什么问题?为什么会出现这个错误?如何删除?

java - 如何查找类加载器加载哪些 jar 以及以什么顺序加载?

Java drawLine() 方法不将类变量作为输入

java - Grails 1.3.1 : Improved Query Caching

java - 如果我在对象的 Finalize 方法中保存对对象的引用,该对象是否会被 GC 回收?

java - 将 ArrayList 添加到另一个然后清除它会重置新的吗?

java - Spring Integration Java DSL - 捕获在 Enum.valueof() 中使用的 header

java - Android Studio中如何保存按钮的状态?

java - 如何获取我的注释的参数作为 validator ?

java - 单击按钮以使用鼠标滚动工作设置 OnGenericMotionListener 事件