面向对象语言的一个强大的特性是多态,它可以用来在代码中移除if/else语句或者switch-case语句块。没有条件的代码很容易阅读,但有些地方你不得不添加if/else代码块,比如工厂类。
相信你曾经看到过某个工厂类中的if/else变得越来越多。在这篇博文中,将共享几个可以在工厂类中移除if/else语句的方法:
会以下面的代码片段为例:
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; }
第一种方法:使用反射(Reflection)
public static Validator newInstance(String validatorClass) { return Class.forName(validatorClass).newInstance(); }
这是第一个映入我脑海的方法,这看上去很简单,但是调用者必须知道完整的类名。
第二种方法:使用Map
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
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(); }
该方法使用枚举类的方法移除条件逻辑。个人比较喜欢这种方法。
参考 http://www.javacodegeeks.com/2014/10/factory-without-if-else.html
相关推荐
//添加函数的方法 function addEvent( node, type, listener) { if( node.addEventListener ){ // W3C方法(DOM方法) //下面语句中的false意思是用于冒泡阶段,若是true则是用于捕获阶段(IE不支持捕获),所以这里...
2.2.5 多分支if-else语句 41 2.2.6 switch语句 42 2.2.7 枚举类型 44 2.2.8 条件操作符 44 2.3 循环 45 2.3.1 while和do-while语句 45 2.3.2 再谈增量、减量操作符 47 2.3.3 逗号操作符 49 2.3.4 for语句 ...
//移除学号和名字中的空格 no=removeAllSpace(no);//增加的 name=removeAllSpace(name);//增加的 String record[] = new String[] { no, name,String.valueOf(iage),String.valueOf(ien),String.valueOf(icomp)...
所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序...
3.1.2 if-then-else语句 61 3.1.3 嵌套if语句 62 3.2 if条件语句 63 3.2.1 数值比较 63 3.2.2字符串比较 64 3.2.3 文件比较 65 3.2.4 复合条件检查 65 3.3 if-then的高级特征与case命令 66 3.3.1 使用双圆括号 66 ...
1.3.8 if…else语句——条件判断语句 36 1.3.9 return语句——返回 38 1.3.10 switch case语句——条件判断语句 39 1.3.11 throw语句——显式引发异常 40 1.3.12 try…catch…finally语句——捕捉异常 42 1.3.13 ...
//根据key值来移除基于某个特定方法的缓存,而不是移除整个controller下的缓存 String controllerKey = ai.getControllerKey(); if (!ValidateUtils.me().isNullOrEmpty(removeCacheName)) { String ...
实验三 移植U-Boot-1.3.1 实验 【实验目的】 了解 U-Boot-1.3.1 的代码结构,掌握其移植方法。...#else #define TACLS 0 #define TWRPH0 4 #define TWRPH1 2 #endif #if defined(CONFIG_S3C2440) ...
//将variable中的params值移除 DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); } @SuppressWarnings("unchecked") protected List<Content> getList(Map, TemplateModel> params, ...
k++) { //老师的做法,判断语句里的 k,省去下列的if语句。 if (k>j) break; //此处用 continue也可以,只是效率低一点 System.out.print(" "+k+"X"+j+"="+j*k); } System.out.println(); } } } 6、输出...
4、一条语句中声明多个变量 var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 ...
程序描述:本章将介绍 GWT应用中高级应用的部分,包括各中组件和布局、如何发送XMLHttpRequest请求,以及如何解决浏览器历史记录问题等等,同时读者还将详细的了解RPC应用的开发过程。 /xmlsample/AjaxSample....
它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. shutdown-------60秒倒计时关机命令 7. lusrmgr.msc----本机...
HGE Core Functions 层中的函数,大致分层一下几类: 1. 接口函数(Interface functions): hgeCreate --- 初始化HGE 指针,这是一个全局函数,除了这个函数,HGE Cor e Funtions 中所有的函数都需要通过HGE 指针...