共享變量邊界處理

在最近設計服務治理模塊中,涉及到以下的使用方式: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}
這樣,能夠看到輸出符合預想了。
相關文章
相關標籤/搜索