环境
操作系统: 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
上找教程,学会的。