在这里插入图片描述
一、前言
本篇文章围绕课后作业需求:使用匿名内部类实现通用工具,自动计算任意一段业务方法的执行耗时,从需求拆解、设计思路、代码落地、原理剖析到 Lambda 优化完整讲解,帮你吃透匿名内部类经典使用场景,也是开发中常用的「回调 + 模板」设计思想。
需求:编写通用耗时工具,不改动原有业务代码,就能统计任意方法运行消耗的秒 / 毫秒数。
二、实现思路
定义回调接口:只声明一个无参无返回的抽象方法,用来承载需要统计耗时的业务代码;
耗时工具类:接收上述接口对象,在工具方法中固定模板:记录起始时间→执行业务代码→记录结束时间→计算耗时;
匿名内部类:调用工具时,通过匿名内部类临时实现接口,把需要测耗时的业务逻辑写在实现方法中,实现业务和耗时逻辑解耦。
三、完整代码实现

  1. 回调功能接口
    java
    运行
    // 函数式接口:承载需要被计时的业务方法
    @FunctionalInterface
    public interface Task {
    // 待执行的任务方法
    void runTask();
    }
  2. 耗时统计工具类(核心模板)
    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 + " 秒");
      }
      }
  1. 测试类(匿名内部类落地)
    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,是实现通用性能监控、代码埋点的常用方案。

更多推荐