没有IF-ELSE的工厂

面向对象语言具有非常强大的多态性功能,用于删除代码中的if / else或切换大小写。

没有条件的代码易于阅读。 在某些地方必须放置它们,其中一个示例是Factory / ServiceProvider类。

我敢肯定,您已经看到IF-ELSEIF的工厂课程了,而且规模还在不断扩大。

在此博客中,我将分享一些技巧,您可以使用这些技巧来消除工厂课堂上的情况。


我将使用以下代码段作为示例:

public static Validator newInstance(String validatorType) {if ("INT".equals(validatorType))return new IntValidator();else if ("DATE".equals(validatorType))return new DateValidator();else if ("LOOKUPVALUE".equals(validatorType))return new LookupValueValidator();else if ("STRINGPATTERN".equals(validatorType))return new StringPatternValidator();return null;}

反射

这是您要删除条件时想到的第一件事。 您会感到框架开发人员的感觉!

public static Validator newInstance(String validatorClass) {return Class.forName(validatorClass).newInstance();		}

这看起来很简单,但唯一的问题是调用者必须记住完全限定的类名,并且有时可能会出现问题。

地图

映射可用于将实际的类实例映射到一些用户友好的名称:

Map<String, Validator> validators =  new HashMap<String,Validator>(){{put("INT",new IntValidator());put("LOOKUPVALUE",new LookupValueValidator());put("DATE",new DateValidator());put("STRINGPATTERN",new StringPatternValidator());}};public Validator newInstance(String validatorType) {return validators.get(validatorType);}

这看起来也很整洁,没有反射的开销。

枚举

这很有趣:

enum ValidatorType {INT {public Validator create() {return new IntValidator();}},LOOKUPVALUE {public Validator create() {return new LookupValueValidator();}},DATE {public Validator create() {return new DateValidator();}};public Validator create() {return null;}}public Validator newInstance(ValidatorType validatorType) {return validatorType.create();}

此方法使用enum方法删除条件,问题之一是每种类型都需要Enum。 您不想创建大量的文件!

我个人喜欢这种方法。

结论

如果使用else或switch大小写会使代码难以理解,则应尽量避免使用它们。 应该使用语言构造来避免某些切换情况。

我们应该尝试在没有IF-ELSE的情况下进行编码,这将迫使我们提出更好的解决方案。

翻译自: https://www.javacodegeeks.com/2014/10/factory-without-if-else.html

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

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

相关文章

最新70佳单页网站设计案例欣赏(上篇)

单页网站是指只有一个页面的网站&#xff0c;这种形式的网站曾经非常流行&#xff0c;现在依然有很多人喜欢。不过&#xff0c;并不是每个网站都适合做成单页&#xff0c;一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站&#xff0…

浏览器劫持者

launchpage 浏览器劫持者&#xff0c;它会在未经你的许可下就接管你的浏览器。更多 https://launchpage.org/?uidqT5KGGjMhxpsXWEzIkWR44y5McmHTuSG50ukahoC8gOClKIGNwZP0nuyPBoYUFiBINK7 https://ns.freedrive.cn/?sEB5805AD0&ghttp://item.jd.com/13300636764.html 更…

Kubernetes 中文文档

Kubernetes 中文文档 如果想学习 Kubernetes 的小伙伴&#xff0c;可以参考如下文档学习&#xff1a; https://www.kubernetes.org.cn/docs 文档中详细讲解了 k8s 的设计理念&#xff0c;基本概念&#xff0c;常用命令等。 转载于:https://www.cnblogs.com/miracle-luna/p/1111…

Edge 浏览器

Edge浏览器设计理念 无法播放&#xff1a;https://edgewelcomecdn.microsoft.com/site/images/tabs/rs3/tabs_screen.acd367a2.mp4 控制台消息 WEBGL11256: 检测到 GPU 重置。正在临时切换到软件呈现 WEBGL11056: 遇到的错误太多&#xff0c;将不再记录更多错误 Intersecti…

为什么NULL是错误的?

Java中NULL用法的简单示例&#xff1a; public Employee getByName(String name) {int id database.find(name);if (id 0) {return null;}return new Employee(id); }这种方法有什么问题&#xff1f; 它可能返回NULL而不是对象-这是错误的。 在面向对象的范例中&#xff0c…

网易原来也是个骗子

当初开通photo.163.com网易相册时&#xff0c;就是看着网易的宣传口号&#xff1a;免费而且不限容量&#xff01;结果现在坏了&#xff0c;规则说改就改&#xff0c;容量一下子收到1G&#xff0c;超过部份要么给钱&#xffe5;&#xffe5;&#xffe5;&#xffe5;&#xffe5…

不同设备屏幕尺寸和DPR适配

为什么需要适配 目前市面上设备屏幕属性十分多样化&#xff08;宽度和DPR并不一致&#xff09;&#xff0c;而作为设计和前端开发&#xff0c;无法为每个尺寸的设备单独设计一套UI并将其转为前端代码&#xff0c;这不现实。所以我们需要一套方案来将一套设计稿完美呈现在不同尺…

Test 6.29 T3 小学生

问题描述 “不错,不错!那么,准备好迎接下一道题了么?”一道白光闪过,CJK 眼前出现了 1e100 个小学生。“他们中,有一些人轨了我的机子。现在,我需要你在 1S 之内找出他们,并让他们认错!”凭借自己无所不知的神(xuan)奇(xue)力量, CJK 立刻发现了轨了 JesseLiun的机子的那 n 个…

web安全之CSRF

CSRF是什么 CSRF&#xff08;Cross Site Request Forgery&#xff09;跨站请求伪造&#xff0c;是一种攻击方式。通过名字可以看出这个攻击通常是在其他网站发出的&#xff0c;并不是在目标网站。 该攻击会在用户不知情的情况下盗用用户的登录信息请求目标网站完成对目标网站…

AssertJ Fest Hamcrest

我以前曾在博客中介绍过Hamcrest &#xff0c;并使用其assertThat方法优先于JUnit的Assert 。 但是&#xff0c;我很快发现了FEST断言 &#xff0c;并愉快地切换到它。 它提供了与Hamcrest相同的改进的测试可读性&#xff0c;并改善了故障消息&#xff0c;但具有启用IDE自动完…

Edge浏览器开发人员工具

UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240" 本地存储/会话存储模拟达到上限 资源终于全部列表出来了 删除 Cookie 和 删除会话 Cookie 样式可以实时编辑了 …

作为入门开发者应该知道的事

前言 如果你是开始学习编程并且决心学好&#xff0c;或者你刚离开学校还没有工作&#xff0c;这篇文章刚好适合你 我将分享作为开发者在工作过程中积累的关键点和隐藏的真相 编程是件困难的事&#xff0c;不仅仅对你而言 没有人说过编程是简单的事情&#xff0c;如果是的话&…

linux 第一个内核模块Hello World

内核模块是Linux内核向外部提供的一个插口&#xff0c;其全称为动态可加载内核模块&#xff08;Loadable Kernel Module&#xff0c;LKM&#xff09;&#xff0c;我们简称为模块。Linux内核之所以提供模块机制&#xff0c;是因为它本身是一个单内核&#xff08;monolithic kern…

懒惰和贪婪-正则回溯

需要一定的正则基础&#xff0c;并且是基于JS写的文章。 正则表达式是从左往右匹配的。在使用正则表达式的时候我们知道/.*/可以匹配一个字字符串中所有的字符&#xff0c;/.*?/却一个字符都匹配不到。/(.*)\d/中的.\*可以匹配除了最后一位数字的所有字符&#xff0c;但是之前…

简单的Java SSH客户端

可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令&#xff1a; String hello new Shell.Plain(new SSH("ssh.example.com", 22,"yegor", "-----BEGIN RSA PRIVATE KEY-----...") ).exec("echo Hello, world!");jcabi-ssh…

【JS复习笔记】00 序

作为一个前端苦手&#xff0c;说是复习&#xff0c;你就当我是重学好了。 好吧&#xff0c;我当然不可能抱着一个砖头去复习&#xff0c;所以捡了本薄的来读——《JavaScript语言精粹》。 当初带我的人说这本书挺好&#xff0c;就看这本书好了。我觉得他说的挺对。我喜欢这么…

高并发网络架构解决方案分析

1&#xff1a;html静态化2&#xff1a;图片服务器分离3&#xff1a;数据库集群4&#xff1a;缓存5&#xff1a;负载均衡大型高并发高负载网站的系统架构我在Cernet做过拨号接入平台的搭建&#xff0c;而后在Yahoo3721负载搜索引擎前端平台开发&#xff0c;又在猫扑处理过大型社…

Generator执行步骤浅析

在Generator函数出现之前JS的函数只能返回一个值&#xff0c;返回的方式就是return&#xff0c;但是Generator函数可以返回多个值&#xff0c;返回的方式是yield。并且Generator赋予了外部动态影响函数内部的执行顺序的能力。 基础语法 function* f () {const a yield 1cons…

使用 jQuery.Pin 垂直滚动时固定导航

ZKEACMS的导航默认是不能固定的&#xff0c;随着页面的滚动而滚动&#xff0c;为了有更好的用户体验&#xff0c;当页面往下滚动时&#xff0c;可以将导航固定在顶端&#xff0c;这样方便用户点击。 jQuery Pin 借助jQuery的一个插件 jQuery.Pin&#xff0c;这个插件可在用来…

班级名称

在Java中&#xff0c;每个类都有一个名称。 类位于软件包中&#xff0c;这使我们程序员可以一起工作&#xff0c;避免名称冲突。 我可以为A类命名&#xff0c;也可以为A类命名&#xff0c;只要它们位于不同的程序包中&#xff0c;它们就可以很好地协同工作。 如果您查看Class的…