博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
共享变量边界处理
阅读量:4521 次
发布时间:2019-06-08

本文共 1406 字,大约阅读时间需要 4 分钟。

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

abstract  class mybase{       Map
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
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}
这样,可以看到输出符合预想了。

转载于:https://www.cnblogs.com/scy251147/p/10981939.html

你可能感兴趣的文章
MAC下安装与配置MySQL [转]
查看>>
ERROR: ld.so: object '/usr/lib64/libtcmalloc.so.4' from LD_PRELOAD cannot be preloaded: ignored
查看>>
爬虫入门【10】Pyspider框架简介及安装说明
查看>>
android面试(4)---文件存储
查看>>
(转载) 标准C中的字符串操作函数
查看>>
如何提高android串口kernel log等级
查看>>
Docker快速配置指南
查看>>
Python基础---OS模块 (二)
查看>>
【JS点滴】substring和substr以及slice和splice的用法和区别。
查看>>
awk多模式匹配
查看>>
线段树
查看>>
[javascript]实现登陆界面拖动窗口
查看>>
a span等行内元素加margin属性后无效果解决方案
查看>>
傻瓜式硬盘重装win7系统图文加视频教程
查看>>
BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
查看>>
如果一个人请优雅的活着。
查看>>
验证码
查看>>
Django缓存配置
查看>>
Ubuntu下安装 Mysql
查看>>
LeetCode--Reverse Integer
查看>>