【Java】Java中的闭包

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

闭包是编程语言中一种常见的机制,并且在很多编程语言中都有这种特性。尤其是对于Java程序员而言,这个名字对有些程序员有些陌生。但是在实际的编程中或多或少都接触到这个概念,在介绍闭包这个概念前首先要了解一下作用域的概念。

作用域

在编程语言中,程序就是通过指令来处理数据以得到预期的结果。程序中的每条语句对应处理的就是数据。但是程序中是由很多部分所组成,每个部分必然也会有自己要处理的数据。这自然就产生了作用域的概念。

  • 数据在程序中对应的就是变量,程序中的指令处理的就是变量
  • 不同的变量会有不同的可用范围,这就是作用域的概念

通过作用域可以将变量名称可以重复使用,而作用不用在不同作用域的变量一般情况下是不允许直接访问的。

class Test{
    int x = 0;
    public int f(int x) {
        int y = x;
        return y;
    }
}

例如在上述代码段中,方法f中的x作用域只在f内生效,而在Test类中的x在整个类中生效。这两个x是具有不同的作用域的。

闭包

闭包的定义如下:

  • 一个依赖于外部环境的自由变量的方法
  • 这个方法能够访问外部环境的自由变量

首先说明什么是自由变量,自由变量就是作用在当前方法自身作用域之外的变量。闭包就是能够读取其他方法内部变量的方法。通过闭包可以将方法的内部变量和外部变量联系起来,即可以访问当前方法内部作用域之外的变量。

在Java中闭包通过可以通过以下三种方式进行使用:

  • 内部类: 内部类可以对它的外部类的变量进行访问。
public class OuterClass {
	private int x = 5;
	private class InnerClass {
		private int y = 10;
		public int add() {
			return x + y;
		}
	}
}
  • 匿名内部类: 匿名内部类可以对它的外部变量进行访问
public interface Fun() {
	int add();
}
public class OuterClass {
	
	public AnonInner getFun(final int x) {
		final int y = 5;
		return new Fun() {
			public int add() {
				return x + y;
			}
		}
	}
}
  • Lambda表达式:Lambda表达式是匿名内部类的一种简化写法,同样也支持闭包特性。
public void test(){
    int x = 0;
    new Thread(() -> System.out.println(x));
}