代码评审——静态map初始化并赋值问题

发布时间:2023年12月18日

问题描述:

在程序开发过程中,经常使用到Map来进行数据的处理。但在开发过程中,当使用静态Map时,初始化数据会存在一些危险的情况。

可以参考如下示例代码:

	public static Map<String,String> staticMap = new HashMap<String, String>(){{
		put("1","one");
		put("2","two");
		put("3","three");
		put("4","four");
		put("5","five");
	}}; 

此时,使用静态代码扫描工具,会出现以下提示:
Use another way to initialize this instance.

在这里插入图片描述


原因分析:

双括号初始化中,第一个括号的含义是生成一个匿名类,第二个括号的含义是初始化块

Java双括号初始化的方式会导致匿名内部类生成,大量的匿名内部类一瞬间生成会对JVM垃圾回收造成影响,可能导致OOM的发生。

同时,非静态匿名内部类的生成,导致此类会隐式强引用外部类,如果两个类的实例的生命周期不一致,也会导致外部类无法被回收,从而造成了内存泄露。

简而言之,不能使用双括号进行初始化的原因是存在性能问题,可能会导致内存溢出

参考资料:Java 隐藏特性:双括号初始化


解决方案:

解决方法比较多,其中第一种和第二种类似。

第一种:使用静态块进行初始化

	public static final Map<String, String> staticMap;
	static {
		staticMap = new HashMap<String, String>();
		staticMap.put("1", "one");
		staticMap.put("2", "two");
		staticMap.put("3", "three");
		staticMap.put("4", "four");
		staticMap.put("5", "five");
	}

第二种:使用静态方法进行初始化

	public static final Map<String, String> staticMap = createMap();;
	private static Map<String, String> createMap() {
    	Map<String, String> result = new HashMap<>();
        result.put("1", "one");
        result.put("2", "two");
        return Collections.unmodifiableMap(result);
    }

第三种:使用Map.ofEntries初始化(仅支持Java 9+)
其中,Map.of()仅能初始化10以内的数据。

	private static final Map<String,String> staticMap = Map.ofEntries(
        entry("1", "one"),
        entry("2", "two"),
        entry("3", "three"),
        entry("4", "four"),
        entry("5", "five")
     );

官网资料:Map.ofEntries

注:这里仅讨论了静态初始化的方法,其他方法不一一赘述了。


项目实际意义:

在项目开发过程中,我们在处理缓存,常量时,经常会使用静态Map来进行数据处理。
因此,在使用过程中一定不要使用双括号的初始化方法,这样会存在性能和内存泄露的风险。

如果这篇博客对大家有所帮助,我希望能得到各位的免费点赞收藏,作为对我的鼓励和支持。
同时,也请大家在评论区留下您宝贵的意见和建议,我将非常欢迎。
感谢大家的支持评论收藏!!!

文章来源:https://blog.csdn.net/moon_ly/article/details/135065183
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。