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