`
MouseLearnJava
  • 浏览: 459857 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

工厂类中移除if/else语句

    博客分类:
  • Java
阅读更多

面向对象语言的一个强大的特性是多态,它可以用来在代码中移除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

分享到:
评论

相关推荐

    javascript 添加和移除函数的通用方法

    //添加函数的方法 function addEvent( node, type, listener) { if( node.addEventListener ){ // W3C方法(DOM方法) //下面语句中的false意思是用于冒泡阶段,若是true则是用于捕获阶段(IE不支持捕获),所以这里...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    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语句 ...

    一个用java做的简单的成绩管理系统

    //移除学号和名字中的空格 no=removeAllSpace(no);//增加的 name=removeAllSpace(name);//增加的 String record[] = new String[] { no, name,String.valueOf(iage),String.valueOf(ien),String.valueOf(icomp)...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序...

    Shell脚本学习笔记

    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 ...

    C#全能速查宝典

    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 ...

    jfinalpluginsjfinal-dreampie.zip

    //根据key值来移除基于某个特定方法的缓存,而不是移除整个controller下的缓存 String controllerKey = ai.getControllerKey();  if (!ValidateUtils.me().isNullOrEmpty(removeCacheName)) {  String ...

    uboott移植实验手册及技术文档

    实验三 移植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) ...

    cms后台管理

    //将variable中的params值移除 DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); } @SuppressWarnings("unchecked") protected List&lt;Content&gt; getList(Map, TemplateModel&gt; params, ...

    达内 coreJava 习题答案

    k++) { //老师的做法,判断语句里的 k,省去下列的if语句。 if (k&gt;j) break; //此处用 continue也可以,只是效率低一点 System.out.print(" "+k+"X"+j+"="+j*k); } System.out.println(); } } } 6、输出...

    javascript入门笔记

    4、一条语句中声明多个变量 var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 ...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    程序描述:本章将介绍 GWT应用中高级应用的部分,包括各中组件和布局、如何发送XMLHttpRequest请求,以及如何解决浏览器历史记录问题等等,同时读者还将详细的了解RPC应用的开发过程。 /xmlsample/AjaxSample....

    cmd操作命令和linux命令大全收集

    它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. shutdown-------60秒倒计时关机命令 7. lusrmgr.msc----本机...

    HGE_系列教材(1-9)

    HGE Core Functions 层中的函数,大致分层一下几类: 1. 接口函数(Interface functions): hgeCreate --- 初始化HGE 指针,这是一个全局函数,除了这个函数,HGE Cor e Funtions 中所有的函数都需要通过HGE 指针...

Global site tag (gtag.js) - Google Analytics