当前位置: 首页 > news >正文

从一个 “笨办法“ 说起

前几天在写一个数据处理模块时,突然想测一下某个方法的耗时。第一反应是这样的:

public void doSomething() { long start = System.currentTimeMillis(); // ... 业务逻辑 long end = System.currentTimeMillis(); System.out.println("耗时: " + (end - start) + "ms"); }

写了几遍之后就开始烦躁了 ——每个方法都要复制粘贴这三行代码,而且一旦不需要测速了,还得一个个删掉,代码变得又脏又乱。

有没有一种更优雅的方式,既能计算方法耗时,又不污染业务代码?

二、思路:把 "测速" 抽象成一个模板

仔细一想,这其实是一个经典的模板方法模式场景:

记录开始时间

执行某个方法(这是变化的)

记录结束时间并输出

变化的只有第 2 步,那能不能把这部分 "抽出来" 呢?

三、匿名内部类登场

定义一个抽象类,把不变的骨架写好,把变化的部分留给子类:

public abstract class TimeCalculator { public final void calculate() { long start = System.currentTimeMillis(); // 变化的部分,交给子类实现 doWork(); long end = System.currentTimeMillis(); System.out.println("方法执行耗时: " + (end - start) + "ms"); } // 抽象方法,由子类实现具体业务 public abstract void doWork(); }

然后在使用时,匿名内部类就派上用场了:

public class Demo { public static void main(String[] args) { // 匿名内部类,现场实现 doWork() new TimeCalculator() { @Override public void doWork() { // 这里写你的业务代码 try { Thread.sleep(1234); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } } }.calculate(); } }

输出:

四、还能更优雅吗?Lambda 表达式!

如果你用的是 Java 8+,匿名内部类还能进一步简化。给 TimeCalculator 加个函数式接口的 "马甲":

@FunctionalInterface public interface TimeCalculator { static void calculate(TimeTask task) { long start = System.currentTimeMillis(); task.execute(); long end = System.currentTimeMillis(); System.out.println("方法执行耗时: " + (end - start) + "ms"); } } @FunctionalInterface interface TimeTask { void execute(); }

使用时代码清爽到飞起:

public class Demo { public static void main(String[] args) { TimeCalculator.calculate(() -> { // 你的业务代码 try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } }); } }

五、匿名内部类的使用场景总结

通过这次实践,我梳理了匿名内部类特别适合的场景:

场景说明
一次性实现只需要用一次的类,没必要单独写一个文件
回调机制如线程的 Runnable、按钮的点击事件监听
模板方法像本文这样,把不变的部分封装,变化的部分现场实现
函数式接口Java 8 后推荐用 Lambda 替代,但原理相通

六、写在最后

匿名内部类看似只是 "省了一个类文件",但它的真正价值在于让代码更贴近思考方式—— 当你只想专注于 "我要做什么",而不想被 "怎么组织类" 分心时,它就是最好的选择。

当然,如果逻辑复杂、复用性高,还是乖乖写成独立类吧。技术没有银弹,只有合适的场景。

http://www.jsqmd.com/news/1092383/

相关文章:

  • # Rocky Linux 9.5 搭建 Kafka + ELK 完整日志平台技术文档
  • 番外篇 F05:电机控制与PID调节实战《电机控制中的PID调节:位置式/增量式算法解析与使用场景全攻略》
  • 拼多多运营整体框架(2026 最新精细化玩法)
  • 【无标题】实训平台基础软件基于自研Docker容器编排管理引擎,运用云原生和容 器技术构建训练环境
  • 【实战解析】从噪声到特征:ECG信号预处理与智能筛选全流程拆解
  • 5大架构设计原则:深入剖析React Icons开源项目架构
  • 第86题 2026年国家级科研痛点——碳化硅(SiC)单晶衬底缺陷控制与扩径技术
  • MSPM0微控制器GPAMP与VREF模块:构建高精度模拟信号链的实战指南
  • Grad-CAM实战:从理论到热力图生成
  • WPF现代化界面开发架构解析:HandyControls控件库核心技术实现与性能优化指南
  • 正则表达式详解(C++20 )
  • 这些宝藏级在线工具,让你的效率原地起飞
  • HarmonyOS技术精讲-应用间跳转:一键调用系统能力(系统应用跳转)
  • 鹤壁企业采购白酒,怎么选得知道
  • Unity Mod Manager:轻松管理Unity游戏模组的终极指南
  • 专业级暗黑3战斗自动化工具深度解析:5大核心功能实战指南
  • 大麦网Python自动化抢票系统:技术架构与实战应用解析
  • MSP432硬件调试实战:适配器与插座板配置详解
  • 戴森球计划3000+工厂蓝图终极指南:从新手到专家的完整解决方案
  • TrollInstallerX突破性指南:iOS 14-16.6.1设备快速部署TrollStore的实战手册
  • HarmonyOS技术精讲-应用间跳转:跨应用传递数据与返回结果
  • Java高并发编程核心原理:程序员进阶必会!
  • Docker--Docker引擎与镜像相关命令
  • 完整学习LLM(五):Embedding是什么,为什么文本能变成向量
  • 【infra之路】10-PagedAttention 与 KV Cache 管理
  • 配置中心:为什么需要它?如何选型?
  • 开源社区新动态,Github 上值得关注的 ROCm 项目推荐
  • 有限域原根求解:Python实现与数学原理
  • 3分钟掌握AI智能分层:Layerdivider让单图变多层的终极指南
  • 3分钟掌握WorkshopDL:无需Steam轻松下载创意工坊模组