枚举的单例模式的使用方法

来源:互联网 发布:双十一网络销售情况 编辑:程序博客网 时间:2024/05/17 21:52

环境

操作系统: window7
IDE: STS
java:java7

需求

最近在写一个job时,是每5分钟跑一次,其中业务逻辑分别是先获取地区的成分股、指数的成分股、行业的成分股。也就是得到了相应的三个map集合。并且这些成分股集合一般是不会变得(至少在一天内)。我们都知道金融行业,特别是最近,几乎每天都有新股上市,所以呢?地区的成分股每天都会变。指数呢?比如:沪深300、上证50、差不多有可能几个季度都不会变。我现在的代码是,job每5分钟跑的时候,都会重新请求查询数据库。这样明显是浪费服务器的资源。根据上述的需求,最好是每天去请求一次。

枚举 单例模式

在众多的单例模式中,最好的方式自然是枚举形式的单例模式。优点我就不列出了。

我先贴出我的代码:

public enum ComponentStockEnum {    stockofArea("area"), stockofIndexCode("index"), stockofIndustryCode("industry");    private Map<String, Object> stockAreaMap;    private Map<String, List<String>> stockIndexMap;    private Map<String, Object> stockIndustryMap;    private Date preDate;    private ComponentStockEnum(String code) {        if("area".equals(code)){            stockAreaMap =ComponentStockService.getStockofArea();//股票与地区的对应关系        }else if("index".equals(code)){            stockIndexMap = ComponentStockService.getStockofIndexCode();//股票与指数        }else if("industry".equals(code)){            stockIndustryMap = ComponentStockService.getStockofIndustryCode();//股票与行业(申万二级)        }        this.preDate = DateUtil.getBeginOfDay();    }    /**     * 由于使用的是单例模式,以下代码是为了每天都重新获取一次成分股     *      *      * @author yutao     * @date 2017年4月10日下午2:44:33     */    public void reLoadStock(){        this.stockAreaMap.clear();        this.stockIndexMap.clear();        this.stockIndustryMap.clear();        this.stockAreaMap = ComponentStockService.getStockofArea();//股票与地区的对应关系        this.stockIndexMap = ComponentStockService.getStockofIndexCode();//股票与指数        this.stockIndustryMap = ComponentStockService.getStockofIndustryCode();//股票与行业(申万二级)        this.preDate = DateUtil.getBeginOfDay();    }    public Map<String, Object> getStockAreaMap() {        if(DateUtil.compare(DateUtil.getBeginOfDay(), this.preDate)>0){            reLoadStock();        }        return stockAreaMap;    }    public void setStockAreaMap(Map<String, Object> stockAreaMap) {        this.stockAreaMap = stockAreaMap;    }    public Map<String, Object> getStockIndustryMap() {        if(DateUtil.compare(DateUtil.getBeginOfDay(), this.preDate)>0){            reLoadStock();        }        return stockIndustryMap;    }    public void setStockIndustryMap(Map<String, Object> stockIndustryMap) {        this.stockIndustryMap = stockIndustryMap;    }    public Map<String, List<String>> getStockIndexMap() {        if(DateUtil.compare(DateUtil.getBeginOfDay(), this.preDate)>0){            reLoadStock();        }        return stockIndexMap;    }    public void setStockIndexMap(Map<String, List<String>> stockIndexMap) {        this.stockIndexMap = stockIndexMap;    }    public Date getPreDate() {        return preDate;    }    public void setPreDate(Date preDate) {        this.preDate = preDate;    }}

由于每天重新获取数据一次,所以我在每个get的方法中,添加了如下判断:

if(DateUtil.compare(DateUtil.getBeginOfDay(), this.preDate)>0){            reLoadStock();}

如何使用上面的代码呢?

使用方法:

            Map<String, Object> stockofArea = ComponentStockEnum.stockofArea.getStockAreaMap();//股票与地区的对应关系            Map<String, List<String>> stockofIndexCode = ComponentStockEnum.stockofIndexCode.getStockIndexMap();//股票与指数            Map<String, Object> stockofIndustryCode = ComponentStockEnum.stockofIndustryCode.getStockIndustryMap();//股票与行业(申万二级)

这里说明下,我并不是参考了下面文档,才写出来上面代码。只是看了下面的文档后,才使用枚举单例模式,因为之前不知道哪种最好。
枚举如何使用,我是在YouTube上找教程,学会的。

如何正确地写出单例模式

单例模式中为什么用枚举更好

Java 语言中 Enum 类型的使用介绍

1 0