gpt4 book ai didi

java - 枚举与 If-else

转载 作者:行者123 更新时间:2023-12-02 08:24:34 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com