标签:无法 匿名内部类 col 说明 返回 model 轻量级 res ref
java是面向对象的编程语言,使用类中的方法来封装“行为”;java的对象往往比较“重量级”,实例化一个类型通常会涉及到一定数量的其他类型,并需要初始化字段。
不过有些 Java 对象只是对单个函数的封装。例如Java Swing库中定义的接口ActionListener(一种回调接口):
public interface ActionListener { |
因为有些行为只在某个地方需要,这样通常不会为其单独定义一个类型,而是使用匿名类把行为内联(inlne):
button.addActionListener(new ActionListener() { |
在很多并发编程中,会大量使用匿名类,这样不同的线程都可以独占资源,避免抢占资源。
可以减少需要管理的类的数量
随着回调模式和函数式编程风格的日益流行,我们需要在Java中提供一种尽可能轻量级的将代码封装为数据(Model code as data)的方法。匿名内部类并不是一个好的 选择,因为:
(1)语法过于冗余
(2)匿名类中的 this 和变量名容易使人产生误解
(3)类型载入和实例创建语义不够灵活
(4)内部类中无法引用非 final 的外部变量
(5)无法对控制流进行抽象
在java中也叫抽象方法类型SAM(Single Abstract Method)。是指只定义了一个有效方法的interface,这里所说的有效,是指:不是重复定义Object或父接口的方法。
JDK编译器可以根据interface的接口自动判断接口是否是函数式接口,开发人员也可以使用注解@FunctionalInterface 显示定义一个函数接口。
匿名类的语法比较冗余,大量的代码中可能只有几行有用。而lambda表达式也是匿名的,但是它轻量,极度简化。
给出几个lambda示例:
(int x, int y) -> x + y 定义一个“功能”,接收2个int类型参数,返回参数之和 |
() -> 42 定义一个功能,返回42 |
(String s) -> { System.out.println(s); } 定义一个功能,接收String类型参数,并输出控制台,没有返回信息 |
lambda表达式返回一个函数式接口的实现实例——匿名类实例对象。
标签:无法 匿名内部类 col 说明 返回 model 轻量级 res ref
原文地址:https://www.cnblogs.com/zyj-468161691/p/12213143.html