在最近設計服務治理模塊中,涉及到如下的使用方式:
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}這樣,可以看到輸出符合預想了。