zoukankan      html  css  js  c++  java
  • 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,成功在启动后初始化。

  • 相关阅读:
    DateTime的精度小问题
    使用For XML PATH 会影响Cross Apply 返回
    一个update的小故事
    行大小计算测试
    Sql Server 2008R2 遇到了BCP导入各种中文乱码的问题
    php-fpm 启动不了 libiconv.so.2找不到
    Git使用教程
    支付宝接口使用文档说明 支付宝异步通知
    Linux(CentOs6.4)安装Git
    NGINX防御CC攻击教程
  • 原文地址:https://www.cnblogs.com/guangshan/p/4502838.html
Copyright © 2011-2022 走看看