自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

gzyes

在技术的道路上,永远不缺乏充满激情、勇于创新的人们。

  • 博客(548)
  • 资源 (4)
  • 收藏
  • 关注

原创 在java中实现c#的int.TryParse方法

先看一个思维训练题 - - - -> 一个西瓜进价 50 元,卖了 70 元,老板收了 100 元假币。问:亏了多少钱?↑ 上面小题与本文无关。↓ 如下是本文正文。在.net(c#)的mscorlib程序集中,以System.Int32(int的实际类型)为例,有如下TryParse方法。TryParse方法是一种安全、高效的类型转换方式。它不会在转换失败时抛出异常,而是返回一个布尔值来指示转换是否成功,并通过 out参数返回转换结果。如下示例代码,显而易见,这个方法为我们做数据转换带来了极大便利。

2025-12-09 22:44:00 268

原创 灵活用工-连续劳务-计算器工具类,拿走不谢

本期应预扣预缴税额 =(累计收入 - 累计免税收入 - 累计费用 - 累计减除费用 - 累计其他扣除)× 预扣率 - 速算扣除数 - 累计减免税额 - 累计已预扣预缴税额。新规的核心变化之一,是优化了灵活用工人员个人所得税的预扣预缴方式,这对不同收入水平的从业者影响各异。理解了这个税率结构后,关键就在于如何计算出“应纳税所得额”和最终的“应纳税额”。“应纳税所得额”与“应纳税额”的区别:简单来说,​“应纳税所得额”是计算税款的。确定应纳税所得额后,就可以根据税率表计算最终需要缴纳的税款。

2025-11-12 22:38:00 1040

原创 灵活用工平台-连续劳务所得税-计算器-工具类,拿走不谢

本文关键词:个人所得(个人收入);劳务报酬所得;互联网平台劳务报酬所得;个人所得税(本文简称“个税”);本文主要讲新规下互联网平台从业人员的劳务报酬所得的计算方法。

2025-11-12 22:38:00 249

原创 Apollo场景建议配置指南:充分发挥分布式配置中心优势

建议在 Apollo 中配置的核心场景需要集中管理、动态调整、多环境隔离、权限管控或需要灰度发布的配置。这些场景能充分发挥 Apollo 的实时推送、统一管理、安全加密和审计追踪等优势,提升系统灵活性和可维护性,特别适合中大型分布式系统和企业级应用。Apollo 最擅长的是管理那些变化频繁、需要动态调整且对系统影响较大的配置,而非静态不变的数据。摘自公司内部WIKI知识库。

2025-11-06 23:06:00 783

原创 两行日志的时间差很大,有经验的开发者会分析为...

执行的sql语句是'select * from emax_enterprise where enterprise_id=1723705456764793 AND products IN('BossKG','SHENBIANYOUHUO') limit 1'①。观察第一个红框中的两行log,16:40:02.446 - 16:40:01.964 = 482ms, 这个时间程序在做什么?执行完sql后,又出现一个莫名的时间差,16:40:03.433 - 16:40:02.988 = 445ms。

2025-11-03 20:57:00 392

原创 程序日志优化:精准捕获与日志分级,践行数字低碳

海量的日志,尤其是冗长的异常堆栈,不仅占据大量存储空间,其写入过程也持续消耗着计算和电力资源。我们的系统日志优化,也正是遵循类似的“”并非遥不可及的口号,它同样体现在我们编写的每一行代码、每一次针对性的技术优化中。当数百次的异常日志从每天占用数MB空间锐减至几KB时,我们为减少数字世界的“碳足迹”做出了实实在在的努力。对所有的异常“一视同仁”,打印完整的堆栈轨迹,导致单次异常日志就可能超过100行。面对系统每日产生的海量日志,我们的一次小小技术优化,不仅是提升效率,更是一次实实在在的“

2025-10-22 20:47:00 428

原创 聚合系统设计-批付交易中的“双批次ID设计(or双批次号设计)” // 双批次ID设计:在复杂业务场景下构建清晰、可维护的应用系统

在实际应用中,双批次ID设计是一个解决特定复杂性的优雅方案。例如,当一次商户批量请求需要系统内部重试时,可能会生成新的batch_id,但商户用于追踪的保持不变。同时,在进行数据库分库分表时,一个设计良好的batch_id(如雪花算法ID)也能更好地支持数据分布。理解这个设计思想其实并不复杂。我们可以回想一个熟悉的场景:在单笔交易中,我们设计了系统订单号(用于内部流程追踪)和商户订单号(用于与商户侧业务交互)。这两个ID各司其职,共同保证了交易的清晰可溯。

2025-10-14 09:48:00 241

原创 经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡

依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模块不应依赖低层模块,两者都应依赖于抽象;抽象不应依赖细节,细节应该依赖抽象。在经典三层架构(表示层-业务逻辑层-数据访问层)中,这一原则的传统应用方式是通过在层与层之间引入接口层,实现所谓的"面向接口编程"而非"面向实现编程"。在典型实现中,表示层依赖于业务逻辑层提供的接口(如),而非具体的业务实现类。

2025-09-25 12:01:00 294

原创 靠谱的程序员推荐阅读----->《阿里Java开发手册》【强制】所有的覆写方法,必须加@Override注解

为所有覆写方法添加@Override注解,是一个低成本、高回报的最佳实践。它充分利用编译器的静态检查能力,在开发阶段早期就能发现因拼写错误或签名不匹配导致的问题,极大提升了代码的健壮性和可维护性,是团队协作和代码质量保障中非常重要的一环。

2025-09-24 12:48:00 333

原创 Clean Code/代码简洁性Good-Practice:使用统一异常捕获来取代错误处理

Getter// 将第4个参数 writableStackTrace 设置为false,规避使用自定义异常所带来的性能损耗这样改造的主要优势校验逻辑纯净了if语句只关心检查条件并抛出异常,职责单一。消除了重复代码:错误处理逻辑只在一处(catch块)实现,符合DRY原则。代码可读性提高:业务主线更加清晰,不会被大量的错误处理代码所淹没。通过统一异常处理和自定义异常机制,我们能够将参数校验这类重复且繁琐的代码转化为清晰、简洁且易于维护的形式。关键的优化步骤包括定义代表业务错误的自定义异常。

2025-09-18 23:28:00 239

原创 别滥用面向对象设计(OOD)中的继承:从一则简单的回调工具类的重构案例,来看OOP/OOD原则

/ 其他方法省略...重构前问题无法替代工具类作为父类没有提供可替换行为合法的OOP继承关系示例@Override// 支付特定逻辑。

2025-09-08 23:14:00 265

原创 妙哉!这个业务语义化的Builder模式,让对象构建变得更稳、更准、更快

/ AuditSaveBuildSteps.java - 独立的构建步骤接口定义/*此class不对package外暴露*/ interface AuditSaveBuildSteps {// 其他步骤接口...

2025-09-08 22:55:00 329

原创 【程序员英语】程序设计中,day 与 date 这2个单词的区别

总的来说,"day" 更倾向于表示时间单位(一天内的某一时刻,或一周中的某一天),而 "date" 更倾向于表示具体的日期。在不同的编程语言或数据库中,"day" 和 "date" 可能有不同的含义和用法。"by" 强调通过某种方式、手段或工具,表示经由某个地点或路径,或表示由某人或某物完成或引起。"with" 和 "by" 是两个常用的介词,它们在不同的语境中有不同的含义和用法。"with" 强调伴随、附带条件,表示具有某种特征或状态,或表示伴随某人或某物;junit包里的@RunWith注解。

2025-09-01 22:19:00 884

原创 程序设计原则 之——Fail-Fast

在定义RPC接口(如Dubbo或gRPC)时,也应在接口文档或Proto文件中明确参数的约束条件,让调用方和提供方达成共识。服务提供方在实现时,必须再次进行校验,因为调用方可能是不可信的。第一层:前端校验- 在浏览器或客户端进行初步过滤,提供即时用户体验。(可绕过,不可信)第二层:网关层校验- 在API网关(如Spring Cloud Gateway)进行统一的鉴权、限流和基本参数过滤(如必填字段检查)。第三层:Controller层校验核心防御层。使用JSR注解进行声明式的、全面的。

2025-09-01 21:52:00 964

原创 【面向接口编程(IOP)典型场景】底层组件如何实现回调通知上层应用系统?

本文介绍了在账务插件开发中,如何通过“面向接口编程”实现异步转账完成后的回调通知机制。通过定义回调接口,账务组件在异步操作完成后可通知上层应用进行后续业务处理。文章提供了纯 Java 和 Spring 两种实现方式的代码示例,展示了接口在插件化架构中的重要作用,体现了面向接口编程在解耦与扩展方面的优势。我们在开发一个账务插件(sby-plugin-accounting),将账户的充、转、提等记账功能进行封装,实现复用。

2025-08-24 18:36:00 336

原创 一个表示金额的数字是 100000000L,这是多少米?

这段代码所体现的业务逻辑是,转账交易金额低于 100w 时,银行会实时结算;而超过 100w 时,会走快速转账方式,结算时效会下降。银行不同的结算通道,会直接影响到交易的时效。掌握了这一点,转账交易的业务层就可以调整相应的产品策略,以满足结算时效。有同学会说,不就是一个数字嘛,管它是多少呢?那么,从代码可读性的角度来看,怎么能让人一眼就能看出来。当然, 除了javadoc注释,你还有什么更好的实践?持这种想法的同学,估计这半辈子注定是一个码农。今天下午,我在CR时,注意到下面代码中的。

2025-08-12 16:14:00 372

原创 一个表示金额的数字是 100000000L,这是多少米(多少钱)?【代码可读性实践】

这段代码所体现的业务逻辑是,转账交易金额低于 100w 时,银行会实时结算;而超过 100w 时,会走快速转账方式,结算时效会下降。银行不同的结算通道,会直接影响到交易的时效。掌握了这一点,转账交易的业务层就可以调整相应的产品策略,以满足结算时效。有同学会说,不就是一个数字嘛,管它是多少呢?那么,从代码可读性的角度来看,怎么能让人一眼就能看出来。今天下午,我在CR时,注意到下面的银行付款程序中的。持这种想法的同学,估计这半辈子注定是一个码农。当然, 除此之外,你还有什么更好的实践?表示的是 1百万 呢?

2025-08-12 16:14:00 284

原创 【分享排雷经历】系统引入Apache-Tika产生的NoClassDefFoundError错误

我们是在lib库的 sby-component-dfs 包 中添加的Tika依赖。,发现在顶层maven依赖管理文件 spring-base.pom 中,的确显式定义了 commons-io 的版本号!系统的文件导入做安全控制,主要是通过判断文件的扩展名和类型,来限定用户导入文件的合法性,防止非法文件进入系统造成风险。而且,这不符合我们的系统开发规范————maven包依赖统一在顶层pom来管理。错误,并且经测试,这个版本的Tika可以满足我们对系统文件导入的安全控制。同样的Tika,为什么搬到。

2025-08-07 23:30:00 627

原创 聚合系统设计:利用泛型来重构三方服务的底层调用

针对这种三方服务对接的需求场景,我们需要把握好一个设计理念:将三方服务调用涉及的数据加密/签名、http通信、验签/数据解密等通用性功能封装在底层,使上层的接口处理方法专注于接口数据的逻辑处理。三方服务API对接层中,我们将数据加密/签名、http通信、验签/数据解密等通用性功能封装在底层,见下面的。通过使用泛型,让调用者可以指定期望返回的业务数据类型,将类型安全性提前至编译期,有效增强程序健壮性。非正常响应时,code是非200的错误码,data为空。注意,后面我们重点要谈针对这个方法的重构。

2025-07-28 09:25:00 339

原创 `System.out.println(Object)` 的打印行为详解

是 Java 中最常用的输出方法之一,它的行为等同于,因为System.out是一个 PrintStream 实例。方法会打印对象的其中,描述了对象转字符串的机制。继续来看方法,该方法返回一个类名@十六进制哈希码串。

2025-07-22 18:36:00 230

原创 javadoc can be as clear and readable as “@JsonUnwrapped“

【代码】javadoc can be as clear and readable as “@JsonUnwrapped“

2025-07-18 14:35:00 360

原创 使用Apollo配置中心,**静态字段通过`@Value`的setter方法可以实现热更新**

注解并提供了setter方法,Apollo在配置变更时会主动调用该setter方法,从而更新静态字段的值。也就是说,静态变量支持配置热更新吗?由后面的执行日志可以看出来,这3种使用。:在Apollo的扩展支持下,即使是静态字段,只要通过。“的值发生变更时,static变量。是一个静态field。问题:当apollo里的配置项”有如下springbean。的方式,都可以实现配置热更。(静态字段的setter)(实例字段的setter)(静态字段的setter)方法来进行配置参数赋值。

2025-07-11 22:12:00 495

原创 SpringBean的静态字段/静态属性(static的field),支持Apollo配置热更新吗?

因为这与field是否静态无关,而与 @Value修饰的setter方法有关。当配置值变更时,这个setter方法就会触发执行。我们知道,springbean的静态field可以通过显式的setter方法(实例方法)实现注入。也就是说,静态属性(static field)支持配置热更新吗?好奇的我,想看看apollo的相关日志。由后面的执行日志可以看出来,这3种使用。“的值发生变更时,static变量。是一个静态field。问题:当apollo里的配置项”的方式,都可以实现配置热更。

2025-07-11 22:12:00 324

原创 # 跨系统异步业务调用的第一法则::明确失败才失败

我司企服系统的企业客户实名认证,通过与三方服务商“ebaoquan”的API通信来实现。email地址email地址近期,我司系统频繁出现一个问题: 明明企业实名认证数据是正确的,系统里的认证状态却是“FAILED经分析系统代码 , 发现程序调用时, ebaoquan 返回的报文是“”,其中表示异常或错误,而不巧的是,我司程序将这个错误解读成了“认证失败”,将认证记录的认证状态设置成了“FAILED进一步分析程序日志,发现,在调用。

2025-06-27 15:00:00 313

原创 Spring MVC中枚举序列化-如何处理VO中的枚举字段?

JsonValue // 关键注解:标记作为序列化的值"authStatus": 0 // 直接输出 code 值需求场景实现方案序列化结果示例默认行为无配置"PENDING"返回数字编码@JsonValuegetCode()0返回完整对象{"code":0, "desc":"待审核"}全局使用 toString()"待审核"自定义序列化逻辑实现任意自定义格式生产环境推荐:使用返回完整枚举信息,前端可直接展示字段,同时保留code用于逻辑判断。

2025-06-16 14:21:00 382

原创 告别@Data的“一刀切”:深入理解Lombok的精准控制艺术

若需在getter/setter中加入验证、日志或计算逻辑,

2025-06-10 20:15:00 436

原创 上层应用如何为其所依赖的基础SDK里的静态属性赋值?

我们的系统对商户暴露了RestAPI,供合作商户以API的形式接入。为了提高合作商户侧API接入的开发效率,我编写了一个SDK。下面是这个SDK一个工具类,封装了API数据加解密、API数字签名的工具方法。这些工具方法都是静态方法。在这个中,有两个静态field,和,分别是我们系统的数字签名RSA公私钥。和这两个field的值,需要被依赖的上层应用来赋值。那么,要实现 SDK 中的工具类能够从上层应用获取和。

2025-06-05 09:45:00 456

原创 一个Mybatisplus组件扫描不当引起的bug:弄巧成拙,认真的锅,自我怀疑

问题就在于 datamig 的这个自动配置class,它扫描了 MybatisPlusMapperScanConfig, 这就导致 sby-biz-component 中所有的 Mapper接口类都作为spring容器的bean生效了。例如,刷完碗,为了控水,我会把一个碗倒扣在另外两个碗上,然后,自己在忙活中,不小心把碗碰到了地上,结果就碎碎平安了~在我们系统基建层的业务组件包 sby-biz-component 中,最初,我写了两个业务组件,一个是 通道错误码组件,一个是 审核流水组件。

2025-05-27 09:04:00 1003

原创 代码易读性实践

查询数据涉及到读缓存时,可以在方法名中加入缓存相关的词汇,比如Cache、Cached、WithCache等,可以明确表达方法使用了缓存。同时,需要避免使用可能引起歧义的词汇,比如本案例中的“No”,本意是表示“序号”(Number),但与“Cache”结合一起,NoCache,容易让人产生负面联想为“不走缓存”/“没有缓存”。下面6行代码,是在给一个转账对象进行赋值操作,其中包括3个转出账户的属性,和3个转入账户的属性。如果没有,自己手撸一下,在你的IDE里写出来这6行。我在DAO里定义了一个方法,

2025-05-20 11:26:00 298

原创 开窍了!如何为缓存工具类(CacheUtil中的static方法)定义interface(2)

那么,我没有办法了!我曾经在遥远的2017年听过一个架构师讲过类似场景的解决方案,可惜的是,忘却了,脑子里只留下“讲解过”这三个字了。直到最近,我才想到方案。

2025-04-28 09:12:00 449

原创 开窍了!如何为缓存工具类(CacheUtil中的static方法)定义interface(下)

那么,我没有办法了!我曾经在遥远的2017年听过一个架构师讲过类似场景的解决方案,可惜的是,忘却了,脑子里只留下“讲解过”这三个字了。直到最近,我才想到方案。

2025-04-28 09:12:00 375

原创 开窍了!如何为缓存工具类(CacheUtil中的static方法)定义interface

那么,我没有办法了!我曾经在遥远的2017年听过一个架构师讲过类似场景的解决方案,可惜的是,忘却了,脑子里只留下“讲解过”这三个字了。直到最近,我才想到方案。(>>

2025-04-28 09:11:00 447

原创 开窍了!如何为缓存工具类(CacheUtil中的static方法)定义interface(上)

那么,我没有办法了!我曾经在遥远的2017年听过一个架构师讲过类似场景的解决方案,可惜的是,忘却了,脑子里只留下“讲解过”这三个字了。直到最近,我才想到方案。(>>

2025-04-28 09:11:00 243

原创 小重构,大收益!技术重构实践:如何优雅升级老旧接口

小重构,大收益!本次小重构通过版本化路径设计和响应格式分层兼容,在不破坏现有调用的前提下实现了接口的标准化升级,显著提升了接口的可维护性、调用方体验和错误处理能力。

2025-04-22 21:19:00 862

原创 lexer(词法分析器)与 parser(语法分析器)

Lexer是编译器的初始处理模块,主要任务是将输入的原始字符流(如源代码)拆解为具有特定意义的词法单元(token)。例如,对于代码片段int x = 5;,Lexer会识别出关键字int、标识符x、运算符、数字5和分隔符;,每个元素被标记为独立的Token并附带类型信息。这种转换使得后续的语法分析器能更高效地处理代码结构。FastJSON中的具体实现词法分析器(JSONLexer)源码类核心方法public int token() { ... } // 当前Token类型。

2025-04-21 16:05:00 1188

原创 FastJSON 对 `Integer` 类型的编解码(序列化和反序列化)

/ 处理十六进制字符串 "0xFF" → 255FastJSON 通过实现了Integer直接操作原始类型(int等基础类型,primitive type)避免性能损耗。支持多种输入格式(整数、字符串、其他数字类型)。严格校验非法输入,保证数据安全。这种设计模式可以完全复用到自定义类型(如Money)的编解码实现中。

2025-04-21 15:24:00 859

原创 AI都深度思考了,人却不思考了...

AI 虽强大,但它的 “思考” 是基于数据训练,无法替代程序员对业务的理解、对技术的创新探索。【结语】如今,AI 代码生成工具如 Copilot、Cursor 等,能基于简单提示快速输出代码片段,甚至完成复杂功能模块,其 “思考” 速度与覆盖范围令人惊叹。但不少程序员却因此过度依赖,遇到问题便直接让 AI 生成代码,不再主动分析需求、构思算法逻辑,也不深入理解代码背后的原理与设计模式。当人放弃思考,就如同失去灵魂的躯壳,难以形成独特见解,创造力也会被逐渐磨灭。小三、小四的师傅工匠李得知后,一眼发现了问题。

2025-04-20 12:03:00 476

原创 代码 “歪楼”:Money 类在程序里的离奇 “旅程”

这段代码是一个简单的金额赋值操作,本可以非常简洁地实现,但实际采用了较为复杂的方式。这背后反映出了编码意识的浅薄。且不说这个绕路导致的代码执行效率方面的性能损耗和资源浪费。单说代码质量方面,也违背 KISS 原则(Keep It Simple, Stupid)。KISS原则强调代码应该尽可能简单。此代码没有遵循该原则,增加了不必要的复杂度,不符合简洁高效的编码理念。如果不及时纠正这种现象,类似的问题可能会在项目中不断出现,导致代码质量逐渐下降,增加项目的维护成本和风险。

2025-04-05 19:15:00 896

原创 恕我直言,你不懂开发

我发现,多数同学,即使有几年的开发经验,但在应用开发中,思考的比较少。开发一个功能其实是比较容易的,大家都能完成,不过,如果缺乏必要的思考,上来就是干,那么,往往编写的代码要么不易读,要么耦合度高,要么代码结构混乱,要么扩展性不足。这样的代码一多,系统就成了所谓的烂系统了。带来的恶果就是可维护性差,维护成本高,这无疑会大大降低团队的开发效率。我看过许多这样的缺乏思考、缺乏设计的代码,阅读这样的代码有时会感到啼笑皆非。

2025-03-30 22:45:00 635

原创 如你所期,DataIdNameVO 来了!

小改动,大收益!我们通过分析我们复杂的企业系统,抽象出来这个 DataIdNameVO,很大程序上可以降低程序的复杂度,增强代码的可读性,并能提高开发效率。站在宏观的角度,利用OOP设计思想,来不断重构、调优系统,使之可持续发展。当然,这首先需要我们具备这样的能力 和 意识!

2025-03-30 10:39:00 815

使用sql server Profiler监听应用程序执行的sql

Sqlserver Profiler是DBA进行sql监控和调优时必用的一大利器。不过,对于开发人员来说,能够监控到程序运行时的sql,对于排障已经相当方便了。

2013-11-08

tomcat-redis-session-manager-1.2.jar

基于redis缓存的session共享使用的jar包。 tomcat集群环境下(通常是借助于nginx),利用这个session共享策略可以共享同一个session。从而保证客户端iip发生变化时(session相同),不会重新登录。

2021-07-23

MySql客户端连接工具SQLyog_Enterprise

mysql客户端连接工具, 简单易用, 推荐大家使用哦~

2013-06-19

jsonclassgenerator源码

json作为互联网上轻量便捷的数据传输格式,越来越受到重视。但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率。JSON C# Class Generator 能将json格式所表示的Javascript对象转化成强类型的C#实体类,来实现减少代码输入的效果。

2016-04-29

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除