Java 匿名内部类实战:统一统计任意方法执行耗时
·
一、需求场景
我们经常需要统计一段代码 / 自定义方法的执行耗时,如果每次都手动写System.currentTimeMillis()会大量重复代码。利用匿名内部类封装通用耗时工具,任意方法都能直接传入,统一计算执行毫秒 / 秒数,完美演示匿名内部类典型使用场景。
二、完整可运行代码
1. 通用耗时工具类(基于接口 + 匿名内部类)
// 函数式接口,代表待执行的任务
@FunctionalInterface
public interface Task {
void run();
}
// 耗时统计工具
public class TimeCostUtil {
/**
* 统计任务执行耗时,返回秒数
*/
public static double calcCostSeconds(Task task) {
long start = System.currentTimeMillis();
// 执行目标方法
task.run();
long end = System.currentTimeMillis();
// 毫秒转秒
return (end - start) / 1000.0;
}
}
2. 测试调用(匿名内部类写法)
public class TestMain {
public static void main(String[] args) {
// 场景1:测试循环方法耗时
double cost1 = TimeCostUtil.calcCostSeconds(new Task() {
@Override
public void run() {
long sum = 0;
for (int i = 0; i < 100000000; i++) {
sum += i;
}
}
});
System.out.println("循环运算执行耗时:" + cost1 + " s");
// 场景2:测试字符串拼接方法耗时
double cost2 = TimeCostUtil.calcCostSeconds(new Task() {
@Override
public void run() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
}
});
System.out.println("字符串拼接执行耗时:" + cost2 + " s");
}
}
Lambda 简化写法(拓展)
JDK8 之后匿名内部类可简写为 Lambda,底层原理一致:
double cost = TimeCostUtil.calcCostSeconds(() -> {
// 自定义任意业务代码
int num = 0;
for (int i = 0; i < 50000; i++) num++;
});
三、代码原理拆解
- 接口定义规范定义
Task接口约束待执行代码块,工具类只依赖接口,不绑定具体业务代码,实现通用复用。 - 匿名内部类作用调用工具方法时,
new Task(){}即时创建匿名内部类实例,重写run()方法写入需要计时的目标代码,无需单独新建.java文件。 - 耗时计算逻辑执行前记录起始时间戳,执行完毕记录结束时间戳,差值换算为秒,统一封装,不用重复书写计时模板代码。
四、匿名内部类优势(本场景)
- 无需单独创建实现类,代码内联书写,结构紧凑;
- 耗时逻辑统一封装,一处修改全局生效,减少冗余模板代码;
- 工具类完全通用,任意方法、任意代码块都能直接拿来统计耗时。
五、总结
- 本案例是匿名内部类最经典实用场景:回调方法、代码块传参;
- 传统写法每次计时都要手写开始、结束时间,匿名内部类完成模板代码封装,解耦性极强;
- Lambda 只是语法糖,本质仍是函数式接口 + 匿名内部类的思想。
更多推荐

所有评论(0)