很多java程序员都还是很好奇匿名内部类到底有什么卵用,为什么要有这种奇怪的设计。那么今天编程菜鸟为你解答。

从重构的角度来看,匿名内部类可以使你少些一些重复代码,案列如下:

首先我们来看一个代码,计算一个方法执行了多少秒! 其实大多数人都会写。像这样:

public static void test() {long start = System.currentTimeMillis();//执行打印的业务逻辑for (int i = 0; i < 10; i++) {System.out.println(i);}long end = System.currentTimeMillis();System.out.println(end - start);
}

这只是打印的业务逻辑,然而我们也想要统计其它方法的执行时间,那么也需要把除去业务的那几行代码一一复制过去吗?那样太傻了,实际情况中除去业务代码可能非常的长,并且会要是遇到需求变更或者那几行代码出错了都得重新再复制一遍。那样不是得不偿失吗!

能不能将业务代码直接抽取成一段参数呢?很遗憾做不到!

不过可以将这段代码抽取成一个类,或者一个接口的方法。像这样:

public static void test(MyService myService) {long start = System.currentTimeMillis();//执行打印的业务逻辑myService.invoke();long end = System.currentTimeMillis();System.out.println(end - start);
}

看到没有,我将这段代码抽取成了MyService的invoke()方法,MyService长这样:

public interface MyService {public void invoke();}

那么调用的时候就可以这样写了:

public static void main(String[] args) {test(new MyService() {@Overridepublic void invoke() {for (int i = 0; i < 10; i++) {System.out.println(i);}}});
}

这样只要在调用的时候将MyService的invoke方法重写,就能实现各种业务逻辑并统计执行的时间啦。并且我们也不用再写前后那一段统计时间的重复代码了,因为它已经封装进test方法里面了!

有人会问这样有必要吗?只是实现了一个计时功能, 假设这段代码不是计时,而是其它更长更复杂但是不会变动的代码,那么你会觉得这么写是值得的。

然而有人会质问这样写起来是不是太丑了!java8中可以用lambda替换匿名内部类,所以你要是用的java8的话可以还这么写:

public static void main(String[] args) {test(() -> {for (int i = 0; i < 10; i++) {System.out.println(i);}});
}

这样是不是简单得多了呢!是的,不过请注意:lambda表达只能替换

只有一个抽象方法的接口,只有一个抽象方法的接口,只有一个抽象方法的接口,重要的事情说三遍:如果我在MyService中又添加了一个抽象方法invoke2(),那么编译是不通过的.但是如果我想添加一个default修饰符的方法,又可以了,具体原因我就不多解释了,有兴趣的自己可以百度一下 (java8还有一些内置的函数接口可以直接拿来用,这样就可以不用自己再写一些多余的接口了)。

其实说白了,如果你觉得需要将一段非常长的方法中抽取出一个或者多个可能会变动的代码片段,你就可以重构为接口的一个个方法,待调用的时候用匿名内部类重写方法就可以了。

其实jdbc的获取连接以及关闭资源这一块是所有方法通用的,大家不妨尝试用我的方法练练手如何将这两个步骤省略掉,只留下核心的业务逻辑。

匿名内部类的使用场景相关推荐

  1. 匿名内部类使用的场景之一

    当函数参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递 为什么不超过三个,因为匿名重写或者实现方法很多的情况下,重复量很多(例如:抽象类test中的方法过多,那么调用 ...

  2. java匿名内部类的使用场景_java匿名内部类的使用场景

    不错,正是模板方法模式的运用.这个类蛮简单的:首先是一个create()方法,用来产生具体类的对象,留交各具体工厂实现去实现.然后是一个Map类型的静态变量,用来存放具体工厂的实现以及他们的ID号.接 ...

  3. java 匿名类 实现接口_细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】...

    1.前言 匿名内部类是什么东西? 没有名字的内部类就是匿名内部类. 什么场景使用? 匿名内部类适合创建那种只需要一次使用的类. 这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的 ...

  4. java匿名内部类runnable_Java内部类:匿名内部类(四)

    Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的匿名内部类,主要讲述匿名内部类的概念.匿名内部类的好处.匿名内部类的使用前提.和匿名内部 ...

  5. java匿名内部类,什么是匿名内部类,如何定义匿名内部类,如何使用匿名内部类?

    java匿名内部类 什么是匿名内部类? 匿名内部类的使用场景? 匿名内部类如何创建? 匿名内部类的实现和使用 例1(实现接口) 例2(继承类) 什么是匿名内部类? 匿名内部类,顾名思义,就是不知道这个 ...

  6. java中的匿名内部类总结

    java匿名内部类 什么是匿名内部类? 匿名内部类的使用场景? 匿名内部类如何创建? 匿名内部类的实现和使用 例1(实现接口) 例2(继承类) 什么是匿名内部类? 匿名内部类,顾名思义,就是不知道这个 ...

  7. Java 内部类之匿名内部类

    1. 匿名内部类概述 匿名内部类 :是内部类的简化写法.他是一个隐含了名字的内部类.开发中,最常用到的内部类就是匿名内部类了. 2. 书写格式 new 类名或者接口名() { 重写方法; }; 包含了 ...

  8. Java 基础巩固:内部类的字节码学习和实战使用场景

    文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 读完本文你将了解: 背景介绍 四种内部类介绍 成员内部类 静态内部类 局部内部类 ...

  9. Java基础之-内部类(成员内部类,静态内部类,局部内部类,匿名内部类)

    什么是内部类? 内部类表示的事物是外部类的一部分,内部类单独出现没有任何意义(写在一个类里面的类就叫内部类) 内部类的分类 成员内部类,静态内部类,局部内部类,匿名内部类. 什么时候用到内部类? B类 ...

最新文章

  1. 【Mybatis框架】输出映射-resultType与resultMap
  2. OpenGL设置透视投影并渲染旋转的立方体
  3. python解析xml文件elementtree_Python中使用ElementTree解析XML示例
  4. Spring XD 1.0.0.M5在这里!
  5. 传递数组到 Shader
  6. 第一个Python程序——博客自动访问脚本
  7. Hadoop真的适合你吗?
  8. python3 字典有序_Python3 有序字典—OrderedDict()
  9. 我的世界之 paper和spigot 的区别 Java服务端开服
  10. proxool数据库连接池使用方法
  11. Redis中Pipeline的使用
  12. 安卓投屏大师_玩转手机投屏,我推荐三款不一样的投屏工具!
  13. JSONArray.fromObject(); 引入问题
  14. java中mergesort函数怎么用,由mergeSort引发的一些思考
  15. JavaScript 检测当前浏览器内核并提示下载谷歌Chrome浏览器
  16. 图深度学习模型进展和在阿里搜索广告中的应用创新
  17. linux mint17.2 安装fcitx输入法
  18. WebRTC 源码分析
  19. R语言:从 csv 文件中读取数据,然后将数据写入 csv 文件
  20. 【Linux】Rsync基于SSH认证的使用(rsync 命令属于1 v 4 的命令、rsync常用参数基本用法)

热门文章

  1. 【文字版】厂长来了:财务管理是企业信息化的前哨
  2. 两组回归系数差异检验_如何检验两组回归系数之间的差别
  3. 线性回归计算回归系数
  4. 渤海银行总行信息科技部2020春季校园招聘面试总结
  5. reader.exe 摸鱼神器 更换图标版!更隐蔽..阅读神器
  6. 2015 年普及组初赛整理
  7. 用Java编写城市公交查询系统
  8. HTML5 小游戏审核通过,请各位有兴趣的朋友帮忙投票!谢谢。
  9. i春秋WEB CTF 2
  10. “Hello World!”团队第六周第六次会议