
通用方案
文章平均质量分 83
明明如月学长
阿里巴巴 资深 Java 研发工程师。《系统掌握大语言模型提示词 - 从理论到实践》小册作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者、《性能优化方法论》技术电子书作者。热爱技术,喜欢思考,乐于分享。
展开
-
克服对接大语言模型 API 的挑战:5个实用步骤
在现代软件开发中,大语言模型(LLM)已成为许多应用程序的核心组成部分。然而,与大语言模型的 API 的集成并不总是一帆风顺的。本文将深入探讨这些挑战,并提供 5 个实用步骤来克服它们。原创 2023-08-02 08:00:00 · 662 阅读 · 0 评论 -
开源 AI 面临的挑战
本文旨在预测并概述可能在未来十年发生的潜在颠覆性变革,并提出一些想法和解决方案,以帮助开源社区适应这种对未来假设带来的挑战。原创 2023-06-08 18:53:48 · 1172 阅读 · 0 评论 -
如何编写代码审查文档
其实准备代码审查文档并没有浪费很多时间,线下代码审查时自己能够非常清楚自己代码的重点,就可以避免遗漏要点,审查效果会更好。代码审查文档也有助于功能开发时间过长之后,快速找到功能的入口、核心代码的位置等。如果周围的人都不编写代码审查文档你写对应的文档,如果被主管“发现”或许会有更多“机会”。总之,希望大家尤其是大的项目开发完毕进行线下代码评审时积极编写代码审查文档,方便自己也方便他人。原创 2023-06-01 07:30:00 · 2355 阅读 · 1 评论 -
【译】Java 构造 URL 请求链接的推荐姿势
在 Java 中,我们可以使用多个库来动态地向 URL 中添加查询并保证 URL 的有效性。在本文中,我们将学习如何使用其中的三个库。这三个库都执行完全相同的任务,因此我们会发现生成的 URL 相同。原创 2023-05-05 06:00:00 · 1072 阅读 · 0 评论 -
分布式缓存长 key 影响性能怎么办?一文讲透如何优化!
本文提供一些解决 Key 过长的思路,希望对遇到相似问题的同学有启发。欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。申请时标注来自优快云。欢迎加入我们的 slack 工作区,在里面可以对ai 和我进行提问。原创 2023-04-25 06:00:00 · 567 阅读 · 1 评论 -
Pipeline 设计模式的优缺点和实践案例
之前文章中介绍了 Pipeline 设计模式,核心思想是创建一组操作(管道)并将数据在这些操作中传递,每个操作可以独立工作,同时处理多个数据流。有同学提到几个问题,本文简单探讨下。(1)例子中 Pipeline 的代码使用硬编码也可以实现,为什么要用这个模式,有什么好处?(2)Pipeline 设计模式在实际的编码中是怎样体现的?(3)Pipeline 设计模式有什么缺点?如何避免?原创 2023-03-14 00:47:07 · 2905 阅读 · 2 评论 -
Java 中的 Pipeline 设计模式
在本教程中,我们将回顾一个不属于经典 GoF 模式的有趣模式 - Pipeline (管道)模式。它功能强大,可以帮助解决棘手的问题并能帮助我们改进应用程序的设计。此外,Java 还有一些内置解决方案来帮助实现此模式,我们会在文末进行讨论。翻译 2023-03-11 21:14:55 · 3074 阅读 · 0 评论 -
什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?
最近设计某个类库时使用了 ConcurrentHashMap 最后遇到了 value 为 null 时报了空指针异常的坑。本文想探讨下以下几个问题:(1) Map接口的常见子类的 kv 对 null 的支持情况。(2)为什么 ConcurrentHashMap 不支持 key 和 value 为 null?(3)如果 value 可能为 null ,该如何处理?(4)有哪些线程安全的 Java Map 类?(5)常见的 Map 接口的子类的使用场景。原创 2023-03-10 23:38:45 · 2285 阅读 · 0 评论 -
使用 BeanUtils.getProperty 获取属性时出现 NoSuchMethodException: Unknown property 问题分析
下面给出一个自定义工具方法来获取对象的私有属性的参考代码。/*** 获取对象的私有属性* @param instance 实例* @param name 属性名* @param 值类型* @return 属性值Objects . requireNonNull(instance , "instance 不能为空");Objects . requireNonNull(name , "name 不能为空");// 获取目标对象的字节码对象 Class原创 2023-03-10 01:31:34 · 2803 阅读 · 0 评论 -
将非数字的用户ID映射到位图的方案探讨
今天技术群里有同学提出想讲非数字的用户 ID 映射到位图中,计划采用 murmur 3 哈希算法,询问冲撞率是多少。借着这个机会简单聊下非数字用户ID 如何更好地避免冲突,是否有更好的思路。原创 2023-03-09 00:52:03 · 696 阅读 · 0 评论 -
Java 动态判断数组维数并取值
Java 动态判断数组的维数并取值原创 2022-11-24 00:52:09 · 1097 阅读 · 0 评论 -
Java 中通过 key 获取锁的正确方式
我们可以使用 ReentrantLock 来实行线程阻塞。我们通过内部类来封装 Lock。该类统计某个 key 上执行的线程数。暴露两个方法,一个是线程数增加,一个是减少线程数。原创 2022-11-15 00:15:06 · 1668 阅读 · 0 评论 -
IOS 16 RC升级 IOS 16 步骤
之前手机升级到了 IOS 16 RC 版本 ,虽然删除了描述文件,依然无法得到 IOS16.0 正式版的推送,因为它和正式版版本号一致。今天研究了下,可以直接通过爱思助手刷正式版固件的方式”升级“。原创 2022-09-14 00:09:19 · 1951 阅读 · 0 评论 -
同学,运维喊你来精简日志啦 - 日志瘦身方法论
在日常开发中,通常为了方便调试、方便查问题,会打印很多 INFO 级别的日志。随着访问量越来越大,一不小心,某个日志一天的 size 就大于了某个阈值(如 5G),于是,收到了优化日志大小的告警。那么,日志瘦身哪些常见的思路呢? 本文结合实际案例谈谈我的看法。有时候为了方便测试,临时打印很多 INFO 级别日志。等项目上线前,可以将非必要的日志删除或者调整为 DEBUG 级别。但有些场景下有些日志可打印为 DEBUG 也可打印为 INFO,打印成 INFO 级别占空间,打印成 DEBUG 级别线上查问原创 2022-07-06 00:58:02 · 1101 阅读 · 0 评论 -
如何避免忘记清理 ThreadLocal ?
一、背景ThreadLocal 可以解决“线程安全问题”。也可以作为上下文暂存数据以备后续步骤获取。但是 ThreadLocal 用不好的确容易产生故障,因而有些团队不允许使用 ThreadLocal。最核心的一个原因是很容易忘记 clear 数据。那么,有什么优雅的解法没有?二、解法package basic.thread;import com.alibaba.ttl.TransmittableThreadLocal;import java.util.HashMap;impor原创 2022-03-28 22:57:30 · 2398 阅读 · 0 评论 -
编程技巧篇之特殊处理留痕迹
一、背景在日常开发中需要有一些特殊处理的场景。对于特殊处理的场景,建议留下标记,用来和正常的处理作区分。二、举例2.1 日志升级为了方便排查问题,我们可以在 RPC 接口调用时,在上下文中传入某个标识符,如: debugToInfo = true在日志工具类中,判断该标识,如果是 DEBUG 级别,则提升为 INFO 级别。public class LoggerUtil{ public static void debug(Logger logger, String... messag原创 2022-03-23 22:34:59 · 1326 阅读 · 0 评论 -
细微之处见真章之是否要给某些类型的属性赋默认值?
一、背景今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 CollectionUtils 判空,代码更简洁?”二、结论2.1 给默认值,会不会有问题要结合这个业务看比如有些对象没有值时,给一个没有任何属性空对象,很容易导致一些副作用如果是集合,没有值给空集合通常如果没有副作用,尤其是在当前类中使用,可以给默认集合。2.2 编程习惯很重要不管底层是否给了默认值,建议上游统一使用 CollectionUtils 对集合判空。我们无法确定所有返原创 2022-03-23 21:15:27 · 775 阅读 · 1 评论 -
编程技巧篇之线程上下文
一、 背景在实际开发过程中,有时候会采用抽象继承的方式,如模板模式、策略模式实现代码编排和复用。存在的问题:不同流程之间会出现重复使用同一个参数调用下游接口的情况后面某个步骤依赖前面某个步骤产出的中间数据,但前面步骤的返回值中不关注这个中间数据…为了提高性能,避免重复的接口调用;为了降低耦合,可以使用线程上下文工具。二、线程上下文2.1 定义线程上下文如果需要在多线程环境下使用,添加依赖 <dependency> <group原创 2022-03-20 10:40:29 · 2049 阅读 · 0 评论 -
Domain Primitive 使用推荐
一、前言最近对团队的很多同学代码进行了 Code Review ,发现存在很多问题。其中一个问题就是普遍代码内聚不够,将原本需要对象提供的方法外泄给使用者。如一个对象里包括状态字段,使用方需要根据状态判断是否为成功:public class SomeResult{ // 值 为 0 表示成功 private String status; // 标签,其中 HOT 表示热门 private String tage; private Map<String, Object原创 2022-03-09 21:43:08 · 1387 阅读 · 3 评论 -
为啥 Java 中不推荐将 Optional 当做参数使用?
当你使用 Optional 作为参数时, IDEA 会给出警告。那么为什么不建议将其作为参数使用呢?有什么好的替代方案吗? 本文一一为你揭晓。原创 2021-12-25 21:49:26 · 3590 阅读 · 2 评论 -
告别加班/解放双手提高单测覆盖率之Java 自动生成单测代码神器推荐
一、背景很多公司对分支单测覆盖率会有一定的要求,比如 单测覆盖率要达到 60% 或者 80%才可以发布。有时候工期相对紧张,就优先开发功能,测试功能,然后再去补单元测试。但是编写单元测试又比较浪费时间,有没有能够很大程度上自动化生成单元测试的插件,自己简单改改即可呢?自己尝试在 Idea 插件库里搜索相关插件并去尝试使用,发现 TestMe 挺不错。后面谎伴 同学推荐 Squaretest,也挺不错。在这里简单介绍这两个插件。二、推荐工具2.1 Squaretest官网插件地址htt原创 2021-12-03 23:45:19 · 11280 阅读 · 4 评论 -
Java 接口的所有子类都需要执行相同处理逻辑的推荐姿势
一、背景在实际开发过程中,有些时候我们可能会遇到这样的场景,即实现某个功能时,需要“强制”子类型都要执行相同的一段代码。二、描述下面都是伪代码,大家不必纠结于具体细节,理解意思即可。我们需要提供给上游这样一个接口, type 是指当前服务能够处理的类型,something 代表实际执行的业务功能。public interface SomeInterface { String type(); ResultDTO something(Param param);}原创 2021-12-02 00:22:06 · 2961 阅读 · 0 评论 -
“禁止用 select * 作为查询字段列表”落地指南
一、背景《阿里巴巴 Java 开发手册》 MySQL 数据库部分,ORM 映射部分,谈到:【强制】 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。说明:1)增加查询分析器解析成本。2)增减字段容易与 resultMap 配置不一致。3)无用字段增加网络消耗,尤其是 text 类型的字段。甚至有些公司还会对代码进行扫描,当发现代码或者 MyBatis 配置中出现 select * 时会给出告警要求修改。规范中将这么规定的原因给出了解释,但是落地时又会遇到一些原创 2021-12-01 00:18:02 · 4868 阅读 · 4 评论 -
Lambda 表达式带来的复杂性的破解之道
一、背景几年前和多人会提 “Java 8 的新特性”,现在 Java 8 几乎成了标配。曾经很多人抵触 Lambda 表达式,现在几乎也成了标配。实际开发中最常见的是,很多人使用 Stream 来处理集合类。二、看法对于 Lambda 表达式或者 Stream 的看法不尽一致。2.1 支持使用 Lambda 表达式可以减少类或者方法的常见。使用 Stream 可以享受链式编程的乐趣。有些人看别人都在用,似乎有些高端,或者担心自己被淘汰也跟着大量使用。2.2 反对有些人对 lambda原创 2021-11-27 01:34:56 · 2748 阅读 · 1 评论 -
Java 单元测试获取目标日志内容进行断言的推荐姿势
一、背景我们写单元测试的时候,偶尔需要获取被测试对象的 logger 输出的内容,用于断言或者通过单元测试辅助自己排查问题。有什么好的解决方案吗?二、 介绍原创 2021-11-22 23:59:49 · 3468 阅读 · 0 评论 -
Java 实现有限状态机的推荐方案
一、背景平时工作开发过程中,难免会用到状态机,即状态的流转。下面是一个简单的模拟状态机:有些同学会定义为常量,使用 if else 来流转状态,不太优雅。有些同学会定义为枚举,大多数同学会选择使用 switch 来流转状态:import lombok.Getter;public enum State { STATE_A("A"), STATE_B("B"), STATE_C("C"), STATE_D("D"); @Getter priv原创 2021-11-16 00:57:59 · 4628 阅读 · 4 评论 -
Java 范围比较的推荐姿势
一、背景在平时工作开发过程中,很容易遇到判断某个值是否在某个范围的场景。如需要校验某个日期是否在某个范围;需要校验某个版本号是否在某个区间;需要校验某个时间点是否在某个时间段内;判断某个人是否属于某个年龄段;判断某个用户的积分是否属于某个等级的区间等。前一阵子,技术群里有哥们就提了类似的一个问题:判断当前时间是否在周期的时间段里面有什么好的办法吗 比如 当前时间是2021-10-1 5:00:00 ,设置的时间段为 2021-9-30 1:00:00 -2021-9-30 18:00:00周原创 2021-11-12 23:28:29 · 2112 阅读 · 1 评论 -
巧用 Spring 自动注入实现策略模式升级版
一、背景在工作过程中,有时候需要根据不同的枚举(常量)执行不同的逻辑。如,不同的用户类型有不同的处理方式,接口为 Handler ,示例代码如下:public interface Handler { void someThing();}有些同学会选择在 Bean 中定义一个 Map<String,Handler> 的 type2BeanMap,然后使用 xml 的方式,将常量和对应 bean 注入进来。<bean id="someService" class="原创 2021-11-12 00:05:04 · 3610 阅读 · 5 评论 -
Map 有变动时触发特定行为实现
一、背景在平时开发过程中,通常我们会选择使用 Guava 的 Cache 类用作本地缓存。但有些时候,我们不需要过期控制,不想引入 Guava 包,我们也会选择简单粗暴的使用 Map 作缓存。但是,在某些业务场景下,需要在 Map 的属性发生变更时,做一些特殊处理。比如 Map 发生不变化时,要基于 Map 的值生成一份不可变 List。二、方法尝试使用 Guava 的 Cache 类,发现 CacheBuilder 构造 Cache 时,只提供了 RemovalListener 用于移除或替原创 2021-11-09 23:45:53 · 1228 阅读 · 1 评论 -
封装复杂度之批量接口
一、背景在平时项目开发过程中,难免需要作为接口提供方封装批量接口给上游调用;或者作为上游系统调用下游业务或者中间件的批量接口,执行某些操作。常见的批量操作有很多,比如批量查询内容详情,批量发送提醒;批量插入数据、批量更新、批量发送MQ消息等。不知道,大家想过没有。为什么要提供批量接口?作为批量接口的提供方和批量接口的使用方我们通常需要注意哪些问题?二、 问题思考2.1 为什么要提供批量接口?通常最主要的一个原因是为了性能优化。通常 IO 操作是性能的主要瓶颈,批量接口可以减少原创 2021-10-01 10:46:07 · 1746 阅读 · 0 评论 -
性能优化的核心思路,干货分享
一、背景平时技术交流的时候,很多同学都会问一些性能优化方面的问题。比如:有一张订单表为了保持订单记录,更新数据时不能删除,需要打算加上版本号,查询时取版本号最新的给前端,还有场景是查询订单历史给前端。订单表量一般不会太小,每次先分组查询取出最大的一条,然后外层再去取对应的数据再分页显然性能不好。怎么办?可能也会有人会给出一些建议,然后呢?下次在遇到怎么办?网上很少有文章系统讲解性能优化的相关方法论,所以借着这次机会总结出来,分享给大家。俗话说授人以鱼不如授人以渔,本文将自己的性能优化方法原创 2020-07-26 10:24:00 · 21240 阅读 · 3 评论 -
记一次保留订单历史记录的方案讨论
一、背景今天技术交流群里,段段同学提了一个不错的问题。描述如下:假设一条记录包含以下信息:(id,username,score,version),score每次变更,version就加1,对于username相同的数据,只有version最大的那一条是有效的,也就是Mysql按字段分组取最大值记录问题,怎么做才能使查询效率高呢存在的问题:加 version 之后查询最新的用子查询效率不高;建个额外的表记录id 和 version 然后联查,这种做法怪怪的,显然效率也不够高。二、 讨论出几个方案原创 2020-07-08 21:18:17 · 2338 阅读 · 0 评论 -
尽信书不如无书之获取枚举值代码优化
1 背景实际开发中根据枚举的某个属性获取枚举值非常常见。如定义一个枚举:@Getterpublic enum CoinEnum { PENNY(1), NICKEL(5), DIME(10), QUARTER(25); CoinEnum(int value) { this.value = value; } private fi...原创 2019-12-13 00:55:20 · 4424 阅读 · 0 评论 -
Java链式构造对象拓展篇
一、前言之前写过一篇《链式构造对象的正确姿势》https://blog.youkuaiyun.com/w605283073/article/details/89504548使用Builder模式变种,实现kv包含中间状态不断链式方法。本文介绍另外一种。二、背景今天和朋友讨论一个场景,父类有多个子类每个子类想通过链式set属性,然后继承过来的父类的属性怎么办?如果父类型也是设置属性后返回...原创 2019-05-06 22:26:00 · 1585 阅读 · 0 评论 -
Java JUnit测试实现控制台输入的正确姿势
一、背景个别时候有在控制台输入数据,然后通过Scanner读取,去运行某个函数测试的需求。@Testpublic void testScanner() throws Exception{ Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); ...原创 2019-05-08 22:31:10 · 9152 阅读 · 3 评论 -
DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势
一、引言DO、DTO、BO、AO、VO、POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。通过各层POJO的使用,有助于提高代码的可读性和可维护性。------------------------------------------------------------------------------------------------------------...原创 2019-04-30 20:52:27 · 41566 阅读 · 10 评论 -
Java链式对象构造的正确姿势
开发业务代码过程中,如果能过类似JQuey那种链式编程或者Java中的Builder模式一样可以一直点下去,是一种非常爽的体验。如果内部有一些类似Map、JSONObject的属性,怎样更表意呢?怎样隐藏内部数据结构呢?普通的Builder模式应该外部创建Map或者JSONObject对象并赋值,能否有更好的解决方案呢?当然也可以通过uilder中写一个put方法可以避免多出现一个对象...原创 2019-04-24 22:54:26 · 3550 阅读 · 0 评论 -
利用Java枚举实现简单的状态机
利用Java枚举实现状态机的想法比较新颖,在某些场景下用处也很大,看了一篇文章不错翻译在此。-------------------------------------------------------------------------------------------------------------------------------------------1. 概述本文讲述...翻译 2019-04-19 21:13:55 · 2225 阅读 · 0 评论 -
MyBatis Order By注入错误
在开发过程中,安全问题非常重要,一定要注意sql注入问题。常见的写法如下:order by ${orderBy} ${orderType}这里orderBy, orderType是前端传过来的话很容易产生sql注入问题。《Mysql Order By注入总结》专门讲了如何利用这点进行常见的和猜测的sql注入。为什么这样呢,因为mybatis里 $部分是原样输出的,拼...原创 2019-04-17 20:42:20 · 5228 阅读 · 0 评论 -
编写自己的SpringBoot-starter
关于原理和基本用法的介绍一篇文章讲得非常清楚《编写自己的SpringBoot-starter》原文地址:https://www.cnblogs.com/yuansc/p/9088212.html后半段根据遇到的一实际案例,对照讲解。--------------分割线转载部分----开始-----------一、前言我们都知道可以使用SpringBoot快速的开发基于...原创 2019-04-14 23:11:26 · 1312 阅读 · 0 评论