文章目录
解决private对象逸出–返回副本
- 解决private对象逸出--返回副本
如下的代码, 使用的是返回对象的副本的方式, 来解决private对象逸出
package com.thread.background;
import java.util.HashMap;
import java.util.Map;
/**
* 类名称:ReleaseEscapeDemo
* 类描述: 发布逸出的演示
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/1 7:52
* Version 1.0
*/
public class ReleaseEscapeDemo {
//定义一个private私有变量
private Map states;
public ReleaseEscapeDemo() {
states = new HashMap();
states.put("1", "a");
states.put("2", "b");
states.put("3", "c");
}
//对象逸出 返回了一个私有变量
public Map getStates() {
return states;
}
/**
* 返回对象的副本
* @return
*/
public Map getStatesCopy() {
return new HashMap(states);
}
public static void main(String[] args) {
ReleaseEscapeDemo re = new ReleaseEscapeDemo();
System.out.println(re.getStatesCopy().get("1"));
re.getStatesCopy().remove("1");
System.out.println(re.getStatesCopy().get("1"));
}
}
其关键的代码如下 , 新建立一个getStatesCopy
方法, 里面返回一个new hashmap. 并且这个map 的构造 直接传入private的map . 相当于把private的map赋值给了新的map . 这样别的线程获取这个private的map的时候, 即使改了map 的值, 也只是该的new的map 的值, 而没有改private的map 的值. 测试的代码如下, 此处调用了三次
getStatesCopy
方法, 实际上是获取的三个map. 因此即使remove掉了key为1的元素, 再次获取也能拿得到. 所以控制台打印了两个1