IT序号网

java之枚举与 If-else

lexus 2025年02月15日 编程语言 49 0

我有一个要求,我需要从事件列表中构建一个员工对象,如下所示。目前我已经编写了如下代码,但 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())); 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!