一、需求场景

我们经常需要统计一段代码 / 自定义方法的执行耗时,如果每次都手动写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++;
});

三、代码原理拆解

  1. 接口定义规范定义Task接口约束待执行代码块,工具类只依赖接口,不绑定具体业务代码,实现通用复用。
  2. 匿名内部类作用调用工具方法时,new Task(){} 即时创建匿名内部类实例,重写run()方法写入需要计时的目标代码,无需单独新建.java文件。
  3. 耗时计算逻辑执行前记录起始时间戳,执行完毕记录结束时间戳,差值换算为秒,统一封装,不用重复书写计时模板代码。

四、匿名内部类优势(本场景)

  1. 无需单独创建实现类,代码内联书写,结构紧凑;
  2. 耗时逻辑统一封装,一处修改全局生效,减少冗余模板代码;
  3. 工具类完全通用,任意方法、任意代码块都能直接拿来统计耗时。

五、总结

  1. 本案例是匿名内部类最经典实用场景:回调方法、代码块传参
  2. 传统写法每次计时都要手写开始、结束时间,匿名内部类完成模板代码封装,解耦性极强;
  3. Lambda 只是语法糖,本质仍是函数式接口 + 匿名内部类的思想。

 

更多推荐