在一个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?的更多相关文章

  1. shell脚本编程——生产实战案例

    生产实战案例     在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要 ...

  2. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  3. Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  4. 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息

    1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...

  5. JAVA案例练习: 去除ArrayList中重复的字符串(字符串内容相同),去除重复的对象

    package com.yqw.list; import java.util.ArrayList;import java.util.Iterator; public class Demo_ArrayL ...

  6. 基于SpringCloud的Microservices架构实战案例-在线API管理

    simplemall项目前几篇回顾: 1基于SpringCloud的Microservices架构实战案例-序篇 2基于SpringCloud的Microservices架构实战案例-架构拆解 3基于 ...

  7. 基于SpringCloud的Microservices架构实战案例-配置文件属性内容加解密

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...

  8. Flume实战案例运维篇

    Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...

  9. Mapreduce之排序&规约&实战案例

    MapReduce 排序和序列化 简单介绍 ①序列化 (Serialization) 是指把结构化对象转化为字节流②反序列化 (Deserialization) 是序列化的逆过程. 把字节流转为结构化 ...

  10. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

随机推荐

  1. for遍历

    for遍历 一:常规方式 1.遍历数组 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; for(int i = 0;i<10;i++) { cout<<a ...

  2. js各种宽高的总结

    1.clientWidth和clientHeight指元素的可视部分宽度和高度,就是padding+content如果没有滚动条,就是设定的宽度和高度 如果有滚动条,就是设定的宽度和高度减去滚动条的宽 ...

  3. py2neo函数merge参数报错

    代码 a1 = Node("house", name='303') g.merge(a1) 执行报错 Primary label and primary key are requi ...

  4. 批处理(Batch或离线计算)和流计算(Streaming或实时计算)

    大数据处理流程 课程:https://developer.aliyun.com/learning/course/432/detail/5385 流程 发 批处理(Batch或离线计算) 基础:goog ...

  5. 「面试题」20+Vue面试题整理

    「面试题」20+Vue面试题整理 转载地址:https://juejin.cn/post/6844904084374290446 「观感度:」 「口味:红烧猪蹄」 「烹饪时间:15min」 本文已收录 ...

  6. Ubuntu 20.04 使用 vlmscd 搭建 KMS 服务端

    前言 为了内网系统激活需要,搭建此客户端. 1. 下载二进制文件 打开项目官网:https://github.com/Wind4/vlmcsd 下载项目二进制文件: 选择对应系统和架构 选择性能较好的 ...

  7. springboot在线人数统计

    在线人数统计 笔者做了一个网站,需要统计在线人数. 在线有两种: 一.如果是后台系统如果登录算在线,退出的时候或者cookie.token失效的时候就算下线 二.如果是网站前台,访问的时候就算在线 今 ...

  8. 大白话说Python+Flask入门(三)

    写在前面 今天状态很不好,我发现学这部分知识的时候,会出现溜号或者注意力无法集中的情况. 我能想到的是,大概率是这部分知识,应该是超出了我现在的水平了,也就是说我存在知识断层了,整体感觉真的是一知半解 ...

  9. C语言求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。

    /* 开发者:慢蜗牛 开发时间:2020.5.28 程序功能:求100以内的素数 */ #include<stdio.h> int prime(int m); int prime(int ...

  10. 基于.net6.0 Fast.ORM 已全面支持AOT编译 所有Api均测试通过

    Fast Framework 作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer O ...