共享变量边界处理

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

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这两个类中,是两个不一样的对象:html

 @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);
    }

输出结果以下:java

{a=1}
{b=1}

原本咱们觉得二者输出的结果应该都是{a=1,b=1},可是结果却并不是得偿所愿。spa

出现这种问题的缘由,其实在于java自身的类继承机制。extends以后,会在子类中建立副本,从而致使不一样对象的出现。设计

若是想解决这个问题,则须要在一个公共的地方定义一个变量,而后在父类中被引用便可。code

解决方法以下:htm

 @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}
这样,能够看到输出符合预想了。
相关文章
相关标签/搜索