一 前言
说到map,其实很多人都是很头疼的,因为相比于List,Map的可读性更低,因此,在开发中我以前还是比较多的使用List,但是其实Map还是有非常多的好处的,现在就介绍一种Map非常实用的处理方式
## 二 场景
你付款时,有两种付款方式,支付宝和微信支付。针对这两种支付方式会有不同的逻辑处理,这时候你可能会对两种支付方式建立不同的两个类,然后更具传入的类型判断使用哪种支付方式。
boolean isZFB =true;
boolean isWX =true;
if(isZFB){
//调用支付宝实现
}
if(isWX){
//调用微信实现
}
这样会有一个问题,随着支付方式的增多,if就会越来越多,最后很容易成为面条代码。这时候map可以解决这个问题。
## 三 应用
首先我们建立一个抽象的接口(这里面就使用正常的实战例子)
public interface IEdiSender {}
建立接口的实现类
public class Csm001ShipEdiService implements IEdiSender{
public static final String EDI_TYPE = "CSM001";
@Override
public String getEdiType() {
return EDI_TYPE;
}
}
public class Csm002ShipEdiService implements IEdiSender{
public static final String EDI_TYPE = "CSM002";
@Override
public String getEdiType() {
return EDI_TYPE;
}
}
然后在Spring初始化的时候将类型码与实现的实例进行一个映射
@Service
public class EdiSenderProvider implements ApplicationContextAware {
private Map<String, IEdiSender> iEdiSenderMap;
public IEdiSender getEdiSenderByType(String ediType) {
return iEdiSenderMap.get(ediType);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, IEdiSender> beansOfType = applicationContext.getBeansOfType(IEdiSender.class);
iEdiSenderMap = new HashMap<String, IEdiSender>();
for (IEdiSender iEdiSender : beansOfType.values()) {
iEdiSenderMap.put(iEdiSender.getEdiType(), iEdiSender);
}
}
}
然后调用时直接通过类型获取实例就可以了,非常使用,其实这个和Beanfactory的Map是一样的效用。