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