java if emun_关于java:Enum与If-else

我有一个需求,其中我需要从事件列表中构建如下的雇员对象。 目前,我的代码如下所示,但是QE发表评论说可能使用枚举而不是多个。

有人可以建议我如何用枚举实现这一点。

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

}

雅。 根据事件名称为empname,empsal等和switch创建一个枚举(假设您使用的是Java 7+)。 删除杂乱的if-else子句,由于不扫描所有情况,切换速度更快

您好Vinod感谢您的快速回复。 您可以张贴关于如何执行此操作的示例代码片段吗?还有,我使用Java 6而不是7

检查这个问题

您可以在同一示例上查看以下答案。

如果您控制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> 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()));

}

我建议您将处理事件的逻辑移到enum中。如果您使用的是Java 8,则它将类似于:

enum EmployeeField {

ID("empid", Employee::setEmployeeID),

NAME("empname", Employee::setEmployeeName),

SALARY("empsalary", Employee::setEmployeeSalary),

...

private final String key;

private final BiConsumer valueSetter;

EmployeeField(String key, BiConsumer 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));

}

}

然后,您可以完全省去switch语句,而只需使用:

events.stream()

.forEach(ev -> EmployeeField.getFieldForKey(ev.getName())

.setEmployeeField(emp, ev.getValue()));

这也意味着有关雇员字段的所有信息(包括如何设置雇员值)都封装在枚举中,并且可以轻松更改或扩展而不会影响其他任何内容。

请注意,您可以在不使用lambda的情况下在Java 8之前执行类似的操作,但是(在我看来)它并不那么优雅,因为匿名接口实例需要显式化,这会使代码复杂得多。或者,您可以为每个枚举成员重写方法(在我看来),这些方法甚至更丑陋。

有关Java 8之前的版本的信息,请参见stackoverflow.com/questions/7413872 /(setEmployeeField是抽象方法)

@RC那就是我在上一段中提到的方法。我怀疑我们所有人都认为Java 8整洁了很多!

我只是评论链接以说明目的;)

@RC谢谢。很多人似乎仍然是Java 8之前的人。现在,我曾经习惯于lambda和流,我无法想象没有它们:-)

尽管该解决方案有效,但是如果您再看一眼,在这里使用enum几乎毫无意义。您仅有的"优势"只是访问values以获得可用的"字段"列表,对此您实际上并不需要enum。

@AdrianShum我不确定我是否完全理解您的观点。使用枚举的唯一原因是拥有一组预定义的值。这几乎是所有枚举所要做的。您总是可以使用带有一组静态字段的类来代替,但是枚举更整洁。您能否进一步解释一下关于枚举在这里毫无意义的观点?

问题实际上是您没有将枚举本身用作预定义的值集。您只是使用它来保存字符串值。也许是这样:即使您将枚举值重命名为无意义的东西(E1,E2 ...),也不会对程序造成任何影响。您试图实现的只是从字符串到要调用的方法的映射。您只需制作一张地图即可。使用Map实际上更好,因为每次尝试查找要调用的方法时实际上都在进行顺序搜索,而使用Map则效率更高

使用以下代码创建一个枚举

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

}

希望这可以帮助!

这将如何工作?字符串" empname"," empsal"等应映射在枚举中。

请发布正确的答案-如果您需要枚举为EMPNAME和EMPSAL才能使代码正常工作,然后以这种方式在答案中做出选择!

枚举中所做的更改以匹配问题字符串

@barakmanos这个问题要求使用字符串和枚举来替代多号。我已经尝试在此解决方案中使用枚举。

eeek。我真的不喜欢覆盖枚举名称以匹配事件键的样式。那是一个非常脆弱的方法(我认为)。最好在枚举中包含键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理动物园动物c++_《过山车大亨》开发商公开新作 建立自己的动物园

知名模拟经营游戏开发商Frontier Developments近日宣布&#xff0c;旗下游戏《动物园之星》(Planet Zoo)即将在不久后发售&#xff0c;登录Steam平台。本座是一款模拟经营游戏&#xff0c;玩家在游戏中将会从零开始&#xff0c;建立一个属于自己的动物园世界。游戏中有多种不同…

Java_数组练习答案_Java数组练习题带答案.doc

《Java数组练习题带答案.doc》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《Java数组练习题带答案.doc(11页珍藏版)》请在人人文库网上搜索。1、一 填空题1) 数组的元素通过 下标 来访问&#xff0c;数组Array的长度为 Array.length 。2) 数组复制时&#xff0c;将一…

安费诺amphenol连接器_安费诺的Ellison谈信号完整性职业和他的免费开源PCB设计软??件...

Amphenol的信号完整性工程师杰森埃里森(Jason Ellison )Amphenol(安费诺) ICC的高级职员信号完整性工程师杰森埃里森(Jason Ellison )深入了解了网络&#xff0c;给予EE(电子)社区以及他的开源信号完整性项目的重要性。信号完整性工程与其他EE(电子)领域相比如何&#xff1f;他…

python形参和实参命名方式_Python的形参和实参使用方式

Python的形参和实参使用方式形参可以设置参数默认值&#xff0c;设置遵循从右至左原则例如&#xff1a;fun(x0,y1),fun(x,y1)&#xff0c;但不可以是fun(x1,y)形参设置可以为数字字符串变量、元组和字典等任意类型数据&#xff0c;元组形参是在变量名前加*&#xff0c;字典形参…

mysql的contains_mysql中json_contains、json_extract等json查询方法的使用

新版 Mysql 中加入了对 JSON Document 的支持&#xff0c;可以创建 JSON 类型的字段&#xff0c;并有一套函数支持对JSON的查询、修改等操作。JSON是一种轻量级的数据交换格式&#xff0c;采用了独立于语言的文本格式&#xff0c;类似XML&#xff0c;但是比XML简单&#xff0c;…

260多媒体语言如何调节_260马力配9.7米货厢,实拍柳汽H5小三轴载货车

【卡车之家 原创】高速公路按轴的收费实施让9米6大单桥载货车火了起来&#xff0c;能够满足快递快运、电商物流等以方量为主的轻型货物运输。但这种大单桥18吨的限重对于不少卡友来说或许不太够用&#xff0c;而8x4载货车又有些大材小用了。这时&#xff0c;处于中间位置的三轴…

php mysql复杂查询_半复杂的PHP / MySQL Select语句

我目前有3张桌子,我正在用这些桌子来预定某些设备.这是我的桌子&#xff1a;tblEquipment:id name description1 Camera Takes pictures2 Projector Projects pictures3 Laptop Portable ComputertblEvents:id start end first_name last_name email1 2009-08-10 2009-08-11 Jo…

python获取网络信息_利用psutil获取网络信息

获取网络总的io信息[rootbogon python_auto]# vim net.py!/usr/bin/env pythonimport psutilnet_information psutil.net_io_counters()print net_information执行查看网络信息[rootbogon python_auto]# python net.pysnetio(bytes_sent29111743, bytes_recv396060467, packet…

java dispatcher详解_dispatcherservlet初始化过程详解

之前给大家介绍了什么是dispatcherservlet&#xff0c;以及dispatcherservlet配置等方面的内容&#xff0c;那么下面要接着给大家介绍的就是dispatcherservlet初始化过程&#xff0c;一起来了解一下。Web容器启动时将调用HttpServletBean的init方法public abstract class HttpS…

python消息队列模块_day43-python消息队列二-queue模块

Python提供了Queue模块来专门实现消息队列Queue对象Queue对象实现一个fifo队列(其他的还有lifo、priority队列&#xff0c;这里不再介绍)。queue只有maxsize一个构造参数&#xff0c;用来指定队列容量&#xff0c;指定为0的时候代表容量无限。主要有以下成员函数&#xff1a;Qu…

linux php 如何上传webshell,linux+apache+php的一次拿webshell的心得

首先俺先声明俺是个菜鸟&#xff0c;俺虽然是菜鸟但俺不会一直是菜鸟的(一旁兄弟喊到&#xff1a;别俺&#xff0c;俺&#xff0c;俺的&#xff0c;说普通话&#xff01;)。俺&#xff0c;不对&#xff0c;我一直遵照着实践是检验真理的唯一标准这句话学习技术&#xff0c;这不…

paddle 56 将图像分类模型嵌入到目标检测中并实现端到端的部署(用图像分类模型进行目标检测切片分类)

目标检测在功能上一直是涵盖了图像分类的,其包含目标切片检测,目标切片分类。由于某些原因,需要将目标检测的功能退化为检测,忽略其切片分类,使用外部的分类模型。然而这样操作会使得其与原始的部署代码不兼容,为此博主实现将图像分类模型嵌入到目标检测中,并实现端到端…

python3图像识别地类_机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(三)| 干货...

原标题&#xff1a;机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(三)| 干货雷锋网按&#xff1a;本文是介绍用TensorFlow构建图像识别系统的第三部分。 在前两部分中&#xff0c;我们构建了一个softmax分类器来标记来自CIFAR-10数据集的图像&#xff0c;实现了约25…

织梦php重新安装教程,织梦CMS系统后台重装的操作教程

原标题&#xff1a;织梦CMS系统后台重装的操作教程网站在线运行&#xff0c;不可能一点问题都不存在&#xff0c;或者当初的网站设计、架构、功能已经不能满足现在用户的需求&#xff0c;所以我们会对网站做出相应的改动。网站除了前端的改版&#xff0c;还会有后台系统重装、服…

mpu9250姿态融合算法_基于投票方式的机器人装配姿态估计

作者&#xff1a;仲夏夜之星来源&#xff1a;公众号 3D视觉工坊链接&#xff1a;基于投票方式的机器人装配姿态估计论文题目&#xff1a;《Voting-Based Pose Estimation for Robotic Assembly Using a 3D Sensor》这篇文章被发表在2012年的IEEE International Conference on R…

java安卓浏览器下载文件,JAVA实现文件下载,浏览器端得到数据没反应解决方案

JAVA实现文件下载,浏览器端得到数据没反应代码如下public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到要下载的文件名称String filenamerequest.getParameter("filename");//文件存放的路径…

python如何读取kepsever_python linecache读取过程

最近使用Python编写日志处理脚本时&#xff0c;对Python的几种读取文件的方式进行了实验。其中&#xff0c;linecache的行为引起了我的注意。Python按行读取文件的经典方式有以下几种&#xff1a;with open(blabla.log, r) as f:for line in f.readlines():## do somethingwith…

skywalking原理_微服务链路追踪原理

作者&#xff1a;平也来源&#xff1a;关爱程序员社区背景介绍在微服务横行的时代&#xff0c;服务化思维逐渐成为了程序员的基本思维模式&#xff0c;但是&#xff0c;由于绝大部分项目只是一味地增加服务&#xff0c;并没有对其妥善管理&#xff0c;当接口出现问题时&#xf…

php 上次登陆时间,php使用cookie显示用户上次访问网站日期的方法

本文实例讲述了php使用cookie显示用户上次访问网站日期的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;<?php if(!empty($_COOKIE[lastvisit])){//先判断&#xff0c;是否存在cookieecho "您上次访问时间是&#xff1a;".$_COOKIE[lastvisit];setCo…

文本分析软件_读书笔记:伍多库卡茨质性文本分析:方法、实践与软件使用指南...

读书笔记&#xff1a;伍多库卡茨《质性文本分析&#xff1a;方法、实践与软件使用指南》一、这篇文章、这本书或这篇论文的中心思想、核心观点是什么&#xff1f;核心观点&#xff1a;质性数据如何系统化分析&#xff1f;三大主要方法&#xff1a;主题分析、评估分析和类型建构…