D.1 匿名类
第2章已经介绍过,匿名类可以同时声明和实例化一个类。因此,它们和Lambda表达式一样,也能用于提供函数式接口的实现。
由于Lambda表达式提供了函数式接口中抽象方法的实现,这让人有一种感觉,似乎在编译过程中让Java编译器直接将Lambda表达式转换为匿名类更直观。不过,匿名类有着种种不尽如人意的特性,会给应用程序的性能带来负面影响。
- 编译器会为每个匿名类生成一个新的.class文件。这些新生成的类文件的文件名通常以
ClassName$1这种形式呈现,其中ClassName是匿名类出现的类的名字,紧跟着一个美元符号和一个数字。生成大量的类文件是不利的,因为每个类文件在使用之前都需要加载和验证,这会直接影响应用的启动性能。如果将Lambda表达式转换为匿名类,那么每个Lambda表达式都会产生一个新的类文件,这是我们不期望发生的。 - 每个新的匿名类都会为类或者接口产生一个新的子类型。如果你为了实现一个比较器,使用了一百多个不同的Lambda表达式,这意味着该比较器会有一百多个不同的子类型。这种情况下,JVM的运行时性能调优会变得更加困难。
