轉自: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(); }