Java 匿名内部类实战案例:统计任意方法执行耗时

一、前言
本篇文章围绕课后作业需求:使用匿名内部类实现通用工具,自动计算任意一段业务方法的执行耗时,从需求拆解、设计思路、代码落地、原理剖析到 Lambda 优化完整讲解,帮你吃透匿名内部类经典使用场景,也是开发中常用的「回调 + 模板」设计思想。
需求:编写通用耗时工具,不改动原有业务代码,就能统计任意方法运行消耗的秒 / 毫秒数。
二、实现思路
定义回调接口:只声明一个无参无返回的抽象方法,用来承载需要统计耗时的业务代码;
耗时工具类:接收上述接口对象,在工具方法中固定模板:记录起始时间→执行业务代码→记录结束时间→计算耗时;
匿名内部类:调用工具时,通过匿名内部类临时实现接口,把需要测耗时的业务逻辑写在实现方法中,实现业务和耗时逻辑解耦。
三、完整代码实现
- 回调功能接口
java
运行
// 函数式接口:承载需要被计时的业务方法
@FunctionalInterface
public interface Task {
// 待执行的任务方法
void runTask();
} - 耗时统计工具类(核心模板)
java
运行
/**
- 通用方法耗时统计工具
/
public class TimeCountUtil {
/*- 统计任务耗时
- @param task 待执行的业务任务(由匿名内部类实现)
*/
public static void countTime(Task task) {
// 1.记录方法开始时间
long start = System.currentTimeMillis();
// 2.执行业务代码(回调匿名内部类重写的方法)
task.runTask();
// 3.记录结束时间
long end = System.currentTimeMillis();
// 4.计算耗时并输出,转为秒
double second = (end - start) / 1000.0;
System.out.println(“方法执行耗时:” + second + " 秒");
}
}
-
测试类(匿名内部类落地)
java
运行
public class TestMain {
public static void main(String[] args) {
// 案例1:统计循环耗时,使用【匿名内部类】实现Task接口
TimeCountUtil.countTime(new Task() {
@Override
public void runTask() {
// 要测试耗时的业务代码
long sum = 0;
for (int i = 0; i < 100000000; i++) {
sum += i;
}
System.out.println(“循环计算完毕,总和:” + sum);
}
});System.out.println("=====分割线====="); // 案例2:统计休眠耗时 TimeCountUtil.countTime(new Task() { @Override public void runTask() { try { // 模拟业务阻塞 Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } });}
}
四、运行结果示例
plaintext
循环计算完毕,总和:4999999950000000
方法执行耗时:0.042 秒
==========
方法执行耗时:1.503 秒
五、原理剖析:匿名内部类为什么适合这个场景?
无需单独创建实现类:Task接口的实现逻辑只在当前调用处使用一次,不需要新建.java实现类,匿名内部类用完即销毁,精简代码;
回调注入业务:耗时工具的模板逻辑(计时)固定不变,变化的只有业务代码,通过匿名内部类把可变代码注入工具,符合开闭原则;
经典使用场景:一次性临时实现接口 / 抽象类是匿名内部类最主流的落地场景,除了耗时统计,Swing 事件监听、线程启动 (new Thread(new Runnable(){…})) 都是同款写法。
六、拓展:JDK8 Lambda 简化代码
因为Task是只有一个抽象方法的函数式接口,可以用 Lambda 表达式替代冗长的匿名内部类,代码进一步精简:
java
运行
public class TestLambda {
public static void main(String[] args) {
// Lambda替换匿名内部类
TimeCountUtil.countTime(()->{
int num = 0;
for(int i=0;i<50000;i++) num++;
});
}
}
七、总结
匿名内部类适用场景:只需要使用一次的接口 / 抽象类实现,不想单独编写实体类时优先使用;
本案例核心思想:模板方法 + 回调,固定耗时统计骨架,业务代码通过匿名内部类动态传入,也是框架中大量使用的设计思路;
后续开发中:工具类 + 回调接口 + 匿名内部类 / Lambda,是实现通用性能监控、代码埋点的常用方案。
更多推荐
所有评论(0)