zoukankan      html  css  js  c++  java
  • 共享变量边界处理

    在最近设计服务治理模块中,涉及到如下的使用方式:

    abstract  class mybase{
           Map<String, String> cache = Maps.newConcurrentMap();
            abstract void add();
        }
    
        class mya extends mybase{
            public void add (){
                cache.put("a","1");
            }
    
        }
    
        class myb extends mybase {
            public void add() {
                cache.put("b", "1");
            }
        }

    但是在实际使用过程中,发现cache变量,在mya和myb这两个类中,是两个不同的对象:

     @Test
        public void testx(){
            mybase a = new mya();
            a.add();
    
            mybase b = new myb();
            b.add();
    
            System.out.println(a.cache);
            System.out.println(b.cache);
        }

    输出结果如下:

    {a=1}
    {b=1}

    本来我们以为两者输出的结果应该都是{a=1,b=1},但是结果却并非得偿所愿。

    出现这种问题的原因,其实在于java自身的类继承机制。extends之后,会在子类中创建副本,从而导致不同对象的出现。

    如果想解决这个问题,则需要在一个公共的地方定义一个变量,然后在父类中被引用即可。

    解决方法如下:

     @Test
        public void testx(){
            mybase a = new mya();
            a.add();
    
            mybase b = new myb();
            b.add();
    
            System.out.println(a.map);
            System.out.println(b.map);
        }
    
    
        interface mycache{
            Map<String, String> map = Maps.newConcurrentMap();
        }
    
        abstract  class mybase  implements mycache{
            abstract void add();
        }
    
        class mya extends mybase{
            public void add (){
                map.put("a","1");
            }
    
        }
    
        class myb extends mybase {
            public void add() {
                map.put("b", "1");
            }
        }

    输出结果为:

    {a=1, b=1}
    {a=1, b=1}
    这样,可以看到输出符合预想了。
  • 相关阅读:
    Atitit.auto complete 自动完成控件的实现总结
    Atitit. .net c# web 跟客户端winform 的ui控件结构比较
    Atitit.实现继承的原理and方法java javascript .net c# php ...
    Atitit.javascript 实现类的方式原理大总结
    Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9
    Atitit..组件化事件化的编程模型--(2)---------Web datagridview 服务器端控件的实现原理and总结
    c#类库中使用Session
    Oracle和Redhat下载地址
    IIS (HTTP Error 500.21
    浅淡Windows7 32位与64位/x86与x64的区别
  • 原文地址:https://www.cnblogs.com/scy251147/p/10981939.html
Copyright © 2011-2022 走看看