zoukankan      html  css  js  c++  java
  • Java代码消除switch/case,if/else语句的几种实现方式

    转自:https://my.oschina.net/stefanzhlg/blog/372413

    我们在平时的编码中,我们经常会遇到这样的情况:
    使用过多的switch/case 或者 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;
            }

    或相应的switch case代码。


    下面我提供几种方式消除这些讨厌的switch/case,if/else语句:

    1、反射

    利用反射创建对象:

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

    缺点:需要根据类的全名进行返回对象。

    2、Map

    提前将对象根据相应的key-object放入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);
            }

    3、Enum

    根据不同的枚举类型值调用newInstance创建出不同的对象。

    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();
    }
  • 相关阅读:
    【bzoj1878】[SDOI2009]HH的项链
    【bzoj2821】作诗(Poetize)
    【bzoj2120】数颜色
    PAT 乙级真题 1005.德才论
    PAT 乙级真题 1004.福尔摩斯的约会
    博客园使用悬挂猫(上吊猫)置顶插件
    PAT 乙级真题 1002.数字分类
    AcWing 789.数的范围
    AcWing 788.逆序对的数量
    二分查找
  • 原文地址:https://www.cnblogs.com/njl041x/p/9640309.html
Copyright © 2011-2022 走看看