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

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}
这样,可以看到输出符合预想了。
posted on 2019-06-05 21:05  程序诗人  阅读(156)  评论(0编辑  收藏  举报