一般来说,匿名内部类有一些不理想的特性,会影响应用程序的性能。 首先,编译器会为每个匿名内部类生成一个新的类文件。文件名通常为 ClassName$1 ,其中 ClassName 是定义匿名内部类的类名,后面跟一个美元符号和一个数字。生成许多类文件是不可取的,因为每个类文件在使用前都需要加载和验证,这会影响应用程序的启动性能。加载可能是一项昂贵的操作,包括磁盘 I / O 和解压缩 JAR 文件本身。
如果将 lambda 转换为匿名内部类,那么每个 lambda 都需要一个新的类文件。每个匿名内部类在加载时都会占用 JVM 的元空间(即 Java 8 中永久生成的替代空间)。如果 JVM 将每个匿名内部类中的代码编译成机器代码,则会将其存储在代码缓存中。此外,这些匿名内部类将被实例化为单独的对象。
因此,匿名内部类会增加应用程序的内存消耗。为了减少所有这些内存开销,引入缓存机制可能会有所帮助,这也是引入某种抽象层的原因。 最重要的是,如果从一开始就选择使用匿名内部类来实现 lambda ,就会限制未来 lambda 实现变化的范围,以及它们与未来 JVM 改进保持一致的能力。
让我们来看下列代码:
import java.util.function.Function; public class AnonymousClassExample { Function<String, String> format = new Function<String, String>() { public String apply(String input){ return Character.toUpperCase(input.charAt(0)) + input.substring(1); } }; }