实战案例丨代码优化:如何去除context中的warning?
在一个java语言群里面,有人抛了这么一段代码出来,问题是出现了下下图中的warning,问有什么好的方法消除


这种强转都是因为类型链条断掉了,写入的时候擦除了类型,读出来的时候也就只能强转了,那个instanceof 其实并没有帮到什么忙,无外乎把A异常变成了B异常。
最简单的解决方法也非常直观,就是加上 @SuppressWarnings("unchecked")。
这里先不谈用其他的方法相对优雅的除掉这个warning,而是看看这段代码本身的问题。
这是一个context,这种模式就是一个数据容器,啥都能装,通过编码的人来保证类型匹配,进去擦除类型,出来补上类型,能不能弄对,全看人。
这种模式类似于在其他的语言里面就拿个容器类型就开始编程,忽略一切的type信息。
我们应当能够看到几个问题
1. context装进去的是有类型化的对象,出来就没有了,设计上讲究封装性,封装基本的就要保证对称,那么context抹除掉的东西,就应该由他来补上。
2. 由于他没有补上,所以所有使用的地方自己来补充,代码其实会产生很多冗余,考虑到他是一个context,那么实际上其他地方一定还有很多处有类似的代码
3. 这里模拟的其实是一个computeIfAbsent的逻辑,如果没有对象就补一个默认值,然后set进去,借用了isEmpty来婉转的表达容器里面没有这个元素。这里作者应当对java容器上的computeIfAbsent一类的方法不熟悉,因为兜兜转转做的就是这个事情。
4. 由于没有用computeIfAbsent,自己的实现中,无论对象是否存在于context中,都会new一个HashMap出来,这在多数情况下,都是一个浪费。
5. 更不要说,当他发现类型不匹配的时候,仅仅打了一行日志。 元素没有推进去,程序也不知道,只有日志知道了。
下面是一个建议的解决方案
1. context做对称设计,出来的时候就把类型转换好,不要让调用者自己来做。 这样抑制告警就在一处即可。
2. 实现computeIfAbsent的逻辑封装,有就返回,没有就插入一个对象,然后返回对象。 对象的创建是按需的。
context的包装类样子如下
public static class SomeClass {
Map<String, Object> context = new HashMap<>();
@SuppressWarnings("unchecked")
public <T> T computeIfAbsent(String key, Supplier<T> defaultGen) {
return (T) context.computeIfAbsent(key, k -> defaultGen.get());
}
}
使用者样子如下
public static class Usage {
public void test() {
SomeClass workingClass = new SomeClass();
Supplier<Integer> wantToAppendItem = () -> 2;
Map<String, Supplier<Integer>> element = workingClass.computeIfAbsent("my-key", HashMap::new);
element.put("level2-key", wantToAppendItem);
Supplier<String> wantToAppendStringItem = () -> "good";
workingClass.computeIfAbsent("my-str-key", HashMap::new).put("level2-str-key", wantToAppendStringItem);
}
}
是不是会好一点,业务也更聚焦一点,从鸡毛蒜皮的重复中解脱出来了?
实战案例丨代码优化:如何去除context中的warning?的更多相关文章
- shell脚本编程——生产实战案例
生产实战案例 在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要 ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息
1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...
- JAVA案例练习: 去除ArrayList中重复的字符串(字符串内容相同),去除重复的对象
package com.yqw.list; import java.util.ArrayList;import java.util.Iterator; public class Demo_ArrayL ...
- 基于SpringCloud的Microservices架构实战案例-在线API管理
simplemall项目前几篇回顾: 1基于SpringCloud的Microservices架构实战案例-序篇 2基于SpringCloud的Microservices架构实战案例-架构拆解 3基于 ...
- 基于SpringCloud的Microservices架构实战案例-配置文件属性内容加解密
使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...
- Flume实战案例运维篇
Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...
- Mapreduce之排序&规约&实战案例
MapReduce 排序和序列化 简单介绍 ①序列化 (Serialization) 是指把结构化对象转化为字节流②反序列化 (Deserialization) 是序列化的逆过程. 把字节流转为结构化 ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
随机推荐
- Java虚拟机(JVM):第一幕:起源,不一定全,但是一定靠谱
在学习JVM之前,先分享一则信息:2009 年4月20日,Orace 宣布正式以74 亿美元的价格收购市值曾超过2000 亿美元的Sun公司,传奇的Sun Microsystems 从此落幕成为历史. ...
- 掌握Go类型内嵌:设计模式与架构的新视角
本文深入探讨了Go语言中的类型内嵌特性,从基础概念到实际应用,以及相关的最佳实践.文章不仅讲解了如何在Go中实现和使用类型内嵌,还通过具体的代码示例展示了其应用场景和潜在陷阱.最后,文章总结了类型内嵌 ...
- 快速掌握keepalived
转载请注明出处: Keepalived是一个基于VRRP(虚拟路由冗余协议)的开源软件,用于在Linux系统上实现高可用性和负载均衡.它的主要功能是通过多台服务器之间的协作,确保在其中一台服务器发生故 ...
- 前端CSS五中元素定位类型
元素想通过底部.顶部.左侧.右侧属性定位是必须先设定position的属性值 posistion属性的五个值:static.relative.fixed.absoulte.sticky static定 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
在我们开发的前端项目中,往往为了方便,都需对一些控件进行自定义的处理,以便实现快速的数据绑定以及便捷的使用,本篇随笔介绍通过抽取常见字典列表,实现通用的字典类型绑定:以及通过自定义控件的属性处理,实现 ...
- ELK7.x环境部署
1.Elasticsearch (ES)配置: 部署配置ES,需要配置JDK环境,JDK是Java语言的软件开发工具包: 下载JAVA jdk源码包: wget https://mirrors.yan ...
- Unity3D 选择焦点切换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- CF223B Two Strings 题解
题目链接 题目分析 题目很短,只有两句话,可分析的不多,似乎难以入手,我们不妨换一个思路转化一下题意,改为:是否对于 \(s\) 中的每一个字符,总有一个等于 \(t\) 的 \(s\) 的子序列覆盖 ...
- html-7(JavaScript-1)
放在函数里面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- 邮差之死--python源代码
"""sth imported""" import time import os '''2 flags''' flag = 0 tmp = ...