java如何减少if判断让代码优雅一点:采用Map+工厂模式实现 原创 2021-11-18 12:27:24.0 阅读(2872)次 最近在写一个数据生成工具,代码中需要判断各种数据类型,有一个枚举中定义了很多类型,根据这些不同类型有不同的操作,于是我写了一大排的if,把自己都给搞晕了,代码大致如下: 数据类型枚举定义: ```java public enum GenerateDataType { /** * 自增,对应java的Long */ AutoIncre(), /** * 字段串类型 */ String(), /** * 数字 */ Number(), /** * 生成uuid,带横线- */ UUID(), /** * 生成uuid,并去除- */ uuid(), /** * 日期,如果没有配置format属性,默认生成yyyy-MM-dd HH:mm:ss格式的日期 */ Date(), /** * json对象 */ Object(); private GenerateDataType(){ } } ``` 每个数据类型对应的操作判断的代码: ```java if(dataType.equals(GenerateDataType.AutoIncre.name())){ //操作 } if(dataType.equals(GenerateDataType.String.name())){ //操作 } if(dataType.equals(GenerateDataType.Number.name())){ //操作 } if(dataType.equals(GenerateDataType.Date.name())){ //操作 } ... ``` 上面这样各种判断,可苦了我,于是想整改重构一下这些代码,将所有类型的操作都实现一个接口,采用工厂模式根据不同类型调用不同接口实现,这样就去掉了if判断,让代码更优雅,具体代码如下: 定义各种数据类型公用的操作接口: ```java public interface ValueHandle { public String handleValue(String column,GenerateDataContext context); } ``` 定义各个数据类型的操作实现类 自增长类型 ```java public class AutoIncreValueHandle implements ValueHandle { @Override public String handleValue(String column, GenerateDataContext context) { return null; } } ``` 数字类型 ```java public class NumberValueHandle implements ValueHandle { @Override public String handleValue(String column, GenerateDataContext context) { return null } } ``` 。。。 再定义工厂 ```java public class DataTypeValueFactory { static Map operationMap = new HashMap<>(); static { operationMap.put(GenerateDataType.AutoIncre.name(), new AutoIncreValueHandle()); operationMap.put(GenerateDataType.String.name(), new StringValueHandle()); operationMap.put(GenerateDataType.Number.name(), new NumberValueHandle()); operationMap.put(GenerateDataType.UUID.name(), new UUIDsValueHandle()); operationMap.put(GenerateDataType.uuid.name(), new UuidValueHandle()); operationMap.put(GenerateDataType.Date.name(), new DateValueHandle()); operationMap.put(GenerateDataType.Object.name(), new DateValueHandle()); // more operators } public static ValueHandle getDataTypeValueHandle(String dataType) throws Exception { ValueHandle dataTypeValueHandle = operationMap.get(dataType); if (dataTypeValueHandle == null) { throw new Exception("dataType:"+dataType +" is unsupported data type!"); } return dataTypeValueHandle; } } ``` 从工厂中取的对应类型的实现来调用不同的类型操作 ```java ValueHandle valueHandle = DataTypeValueFactory.getDataTypeValueHandle("Number"); Object columnData = valueHandle.handleValue("age",context); ``` 这样Map替代了if判断,工厂模式与接口的设计拆开解藕各种数据类型的操作,就不需要写if判断了,整个代码优雅不少,修改一个类型的操作不会影响其他类型,减少出错 java 设计模式 上一篇:java表达式运算性能比较:Jep与QLExpress 下一篇:java接口中定义成员变量后会被不同实现类修改,别忘记接口变量默认是public static final
相关文章 Jep实现Java表达式计算(2057) 阿里巴巴p3c代码规范eclipse插件(1554) java使用snakeyaml库读取和操作yml文件(2496) java通过域名获取域名的IP地址(1520) jmeter随机日期参数(1128) 线程安全测试 ArrayList Collections.synchronizedList CopyOnWriteArrayList(1514) ThreadLocal正确使用姿势,避免再掉坑(1214) java解析request或url中的参数工具类代码(2919) Base64编码出现换行符(2606) Java实现Https发送get和post请求(2738) 推荐文章 使用spring4实现websocket连接(1) Parameter index out of range (1 > number of parameters, which is 0(7) spring cloud+feign+mybatis中使用seata0.9实现分布式事务(7) spring cloud gateway报错Only one connection receive subscriber allowed(82) spring cloud中Feign调用诡异报错MethodNotAllowed: status 405 reading(116) elasticsearch7.1保存时报错: Validation Failed: 1: type is missing;(7) 聊聊数据保存到MySQL后数据乱码的问题(1) jquery对象与dom对象互转(1) linux使用epel源yum安装iftop、nload、nginx等(2) linux下nginx安装其他模块(1) 热门文章 java stream去重的几种方式(40819) the dependencies of some of the beans in the application context form a cycle(16324) 解决mybatis打印查询结果集造成太多日志的问题(9839) java enum枚举转list和Map(9722) java stream List转Map与List转List与Map转List以及List转Map(8468) ServletRequest转HttpServletRequest设置header之后取不到header的问题(8434) java中BufferedImage转成 base64字符串(8098) 切分List集合为多个List集合(7385) maven修改jar包版本不生效解决办法(6990) bootstrap.yml配置报错:Could not resolve placeholder 'xx' in value (6949) 标签列表 java java java java java java java基础 微服务 异常处理 mysql clickhouse clickhouse clickhouse clickhouse clickhouse spring cloud spring boot linux elasticsearch feign jdbc spring js docker postgresql solr seata nginx maven gateway hsqldb 数据库 架构 大数据分析 分布式事务 redis canal dubbo hadoop 消息队列 win10 websocket springmvc git html select2 mybatis jenkins rocketmq quartz activemq 数据库集群 ajax bat 电脑 笔记 eclipse 设计模式 阿里云 github freemarker jvm jquery javamail redission redission对象 hystrix http hibernate springmail svn ubuntu ueditor xheditor zookeeper 分布式 小程序 开发工具 gitlab