面向对象语言具有非常强大的多态性功能,用于删除代码中的if / else或切换大小写。
没有条件的代码易于阅读。 在某些地方必须放置它们,其中一个示例是Factory / ServiceProvider类。
我敢肯定,您已经看到IF-ELSEIF的工厂课程了,而且规模还在不断扩大。
在此博客中,我将分享一些技巧,您可以使用这些技巧来消除工厂课堂上的情况。
我将使用以下代码段作为示例:
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;}
反射
这是您要删除条件时想到的第一件事。 您会感到框架开发人员的感觉!
public static Validator newInstance(String validatorClass) {return Class.forName(validatorClass).newInstance(); }
这看起来很简单,但唯一的问题是调用者必须记住完全限定的类名,并且有时可能会出现问题。
地图
映射可用于将实际的类实例映射到一些用户友好的名称:
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 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();}
此方法使用enum方法删除条件,问题之一是每种类型都需要Enum。 您不想创建大量的文件!
我个人喜欢这种方法。
结论
如果使用else或switch大小写会使代码难以理解,则应尽量避免使用它们。 应该使用语言构造来避免某些切换情况。
我们应该尝试在没有IF-ELSE的情况下进行编码,这将迫使我们提出更好的解决方案。
翻译自: https://www.javacodegeeks.com/2014/10/factory-without-if-else.html