码迷,mamicode.com
首页 > 其他好文 > 详细

主题1:背景及简介

时间:2020-01-19 12:24:47      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:无法   匿名内部类   col   说明   返回   model   轻量级   res   ref   

背景:

    java是面向对象的编程语言,使用类中的方法来封装“行为”;java的对象往往比较“重量级”,实例化一个类型通常会涉及到一定数量的其他类型,并需要初始化字段。

不过有些 Java 对象只是对单个函数的封装。例如Java Swing库中定义的接口ActionListener(一种回调接口):

public interface ActionListener {
   void actionPerformed(ActionEvent e);
}

匿名类:

因为有些行为只在某个地方需要,这样通常不会为其单独定义一个类型,而是使用匿名类把行为内联(inlne):

button.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
     ui.dazzle(e.getModifiers());
   }
});

优势:

  在很多并发编程中,会大量使用匿名类,这样不同的线程都可以独占资源,避免抢占资源

  可以减少需要管理的类的数量

缺陷:

    随着回调模式和函数式编程风格的日益流行,我们需要在Java中提供一种尽可能轻量级的将代码封装为数据(Model code as data)的方法。匿名内部类并不是一个好的 选择,因为:

(1)语法过于冗余

(2)匿名类中的 this 和变量名容易使人产生误解

(3)类型载入和实例创建语义不够灵活

(4)内部类中无法引用非 final 的外部变量

(5)无法对控制流进行抽象

Java8的改进:

  • 通过提供更简洁的语法和局部作用域规则,Java SE 8 彻底解决了 (1) 和 (2)
  • 通过提供更加灵活而且便于优化的表达式语义,Java SE 8 绕开了(3)
  • 通过允许编译器推断变量的“常量性”(finality),Java SE 8 减轻了(4) 带来的困扰

函数式接口:

    在java中也叫抽象方法类型SAM(Single Abstract Method)。是指只定义了一个有效方法的interface,这里所说的有效,是指:不是重复定义Object或父接口的方法

JDK编译器可以根据interface的接口自动判断接口是否是函数式接口,开发人员也可以使用注解@FunctionalInterface 显示定义一个函数接口。

优点:

  • 接口是 Java 类型系统的一部分
  • 接口天然就拥有其运行时表示(Runtime representation)
  • 接口可以通过 Javadoc 注释来表达一些非正式的协定(contract),例如,通过注释说明该操作应可交换(commutative)

lambda表达式:

  匿名类的语法比较冗余,大量的代码中可能只有几行有用。而lambda表达式也是匿名的,但是它轻量,极度简化。

给出几个lambda示例:

(int x, int y) -> x + y

定义一个“功能”,接收2个int类型参数,返回参数之和

() -> 42

定义一个功能,返回42

(String s) -> { System.out.println(s); }

定义一个功能,接收String类型参数,并输出控制台,没有返回信息

 

lambda表达式返回一个函数式接口的实现实例——匿名类实例对象

主题1:背景及简介

标签:无法   匿名内部类   col   说明   返回   model   轻量级   res   ref   

原文地址:https://www.cnblogs.com/zyj-468161691/p/12213143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!