Java静态变量的用法:伪单例
这几天遇到一个问题,一个Service里有一个map,但是这个Service有别的继承,于是每一个Service都会创建一个map,但是这个map应该是公用的,于是就有问题了。。。(按结构说Service里是不应该有map存在的,结果设计有问题,但是结构不影响研究)
特殊的解决方式:把此map改为static即可,因为一个类的静态变量在不同实例中是共用的,所以这样便实现了map的单例模式。
(标准解决方案是放在一个单例的manager中,以便公共调用,这里偷懒。。。)
还有标准单例,一个private static的本类实例,一个public static的获取本类实例的方法,关键的在于构造方法是私有的。(没有构造时默认为共有构造,所以一定要重写构造方法)
public class RateManager {
private static RateManager singleInstance = new RateManager();
public static RateManager getInstance() {
return singleInstance;
}
private RateManager(){
BillRateService billRateService = ApplicationHelper.getApplicationContext().getBean(BillRateService.class);
this.agentRateMap = billRateService.getSipuserRateMap();
this.groupRateMap = billRateService.getSkillGroupRateMap();
}
private Map<String, BillRate> agentRateMap = new HashMap<>();
private Map<String, BillRate> groupRateMap = new HashMap<>();
public void addAgent(String key, BillRate rate) {
this.agentRateMap.put(key, rate);
}
public void addGroup(String key, BillRate rate) {
this.groupRateMap.put(key, rate);
}
public void deleteAgent(String key, BillRate rate) {
this.agentRateMap.remove(key);
}
public void deleteGroup(String key, BillRate rate) {
this.groupRateMap.remove(key);
}
public void refresh() {
BillRateService billRateService = ApplicationHelper.getApplicationContext().getBean(BillRateService.class);
this.agentRateMap = billRateService.getSipuserRateMap();
this.groupRateMap = billRateService.getSkillGroupRateMap();
}
public BillRate getAgentRate(String agentName) {
BillRate rate = this.agentRateMap.get(agentName);
if (rate == null)
rate = this.agentRateMap.get(null);
return rate;
}
public BillRate getGroupRate(String queueId) {
BillRate rate = this.groupRateMap.get(queueId);
if (rate == null)
rate = this.groupRateMap.get(null);
return rate;
}
}
这样还有一个好处就是,可以在构造方法时初始化一些东西。因为静态方法是第一次调用的时候才会初始化的,所以第一次调用的时候才会走new,成功在启动后初始化。
Java静态变量的用法:伪单例的更多相关文章
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
- Java静态变量的初始化(static块的本质)
Java静态变量的初始化(static块的本质) 标签: javaclassstring编译器jdk工作 2010-02-06 07:23 33336人阅读 评论(16) 收藏 举报 分类: Jav ...
- java 静态变量初始化
java 静态变量在编译阶段就已经明确位置, 所以静态变量的声明与初始化在编码顺序上可以颠倒.也就是说可以先编写初始化的代码,再编写声明代码.如: public class Test { // 静态变 ...
- python基础练习题(题目 模仿静态变量的用法)
day27 --------------------------------------------------------------- 实例041:类的方法与变量 题目 模仿静态变量的用法. 程序 ...
- php和java静态变量用途的思考
静态变量有哪些用途? 比如创建单例对象. 统计访问次数.数量等等. 多线路和进程中可能会使用. 深入理解补充.... PHP 单例模式解析和实战 php设计模式——单例模式 php static 与 ...
- 有趣的bug——Java静态变量的循环依赖
背景 是的,标题没有错误,不是Spring Bean的循环依赖,而是静态变量之间的循环依赖. 近期的项目均是简单的Maven项目,通过K8S部署在阿里云上,其配置文件读取规则如下所示: (1) 优先读 ...
- 【Java】设计模型-五种单例模型
一. 什么是单例模式 只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在. 单例模式有很多好处,它能够 ...
- java中你确定用对单例了吗?
作为程序员这样的特殊物种来说,都掌握了一种特殊能力就是编程思想,逻辑比較慎重,可是有时候总会忽略到一些细节,比方我,一直以来总认为Singleton是设计模式里最简单的,不用太在意,然而就是由于这样的 ...
- Effective Java - 构造器私有、枚举和单例
目录 饿汉式单例 静态常量 静态代码块 懒汉式单例 尝试加锁 同步代码块 双重检查 静态内部类单例 枚举单例 Singleton 是指仅仅被实例化一次的类.Singleton代表了无状态的对象像是方法 ...
随机推荐
- Eclipse 中 No java virtual machine was found... 解决方法
这个链接说的不错,http://www.mafutian.net/123.html,,但是还有一种可能是64位和32位的问题,也就是eclipse32位只能用32位的jdk,eclipse64位的只能 ...
- (转)VS2008 VMware联合调试
本文转载自:http://www.cnblogs.com/ziwuge/archive/2012/04/03/2431162.html 一.前期准备: 1. 安装VS2008 2. 安装VM8.0,在 ...
- LevelDB Cache实现机制分析
几天前淘宝量子恒道在博客上分析了HBase的Cache机制,本篇文章,结合LevelDB 1.7.0版本的源码,分析下LevelDB的Cache机制. 概述 LevelDB是Google开源的持久化K ...
- linux 根据进程名查看其占用的端口
linux 根据进程名查看其占用的端口 pasting $ netstat -nap | grep pid //查看进程ID 所占的端口 netstat -lnp 查看端口所在的进程 will ...
- elasticsearch pinyin 拼音分词器
安装pinyin分词 地址:https://github.com/medcl/elasticsearch-analysis-pinyin PUT py_test { "index" ...
- 泛型集合List<T>
- Java之匿名内部类和包装类
匿名内部类 作用: 假如某个类只使用一次,则可以使用匿名内部类,无需再新建该类 我们上下代码: package com.learn.chap03.sec16; /** * 定义接口 */ public ...
- 关于Bootstrap的整理和理解
随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验.作为开发者,我们需要了解一些宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现 ...
- Java微信公众平台开发(十五)--微信JSSDK的使用
转自:http://www.cuiyongzhi.com/post/63.html 在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置] ,但是我们在真正的 ...
- KinderEditor编辑器 在Asp.Net中的使用
KinderEditor编辑器的使用 分为简单的三步. 1:添加引用部分 <script src="/KinderEditor/kindeditor-min.js">& ...