共享變量邊界處理

在最近設計服務治理模塊中,涉及到如下的使用方式:

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}
這樣,可以看到輸出符合預想了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章