简介
在项目中经常看到枚举的values()方法被大量重复使用,殊不知枚举的values()方法每次被调用都会生成一个新的枚举数组返回,这与"尽量复用对象,不要每次重复创建相同的不变的对象"的编码原则相违背(影响垃圾回收)。
枚举的values()方法的背后逻辑
利用字节码工具查看:
编译器帮我们自动生成了一个属性值:$VALUES,类型为com.renzhikeji.demo.EnumDemo[],即EnumDemo数组,静态初始块会初始化此值。
编译器帮我们自动生成静态方法 values(),返回类型为com.renzhikeji.demo.EnumDemo[],根据字节码信息,静态方法 values()的实现是调用了VALUES的clone()方法实现的,即:静态方法 values()每次调用都会通过VALUES的clone()方法返回一个新的数组。
为了减轻GC的负担,如果我们需要大量调用枚举的静态方法 values(),我们可以对静态方法 values()返回的数组缓存起来复用。
小结
枚举的values()方法每次被调用都会生成一个新的枚举数组返回,为了减轻GC的负担,如果我们需要大量调用枚举的静态方法 values(),我们可以对静态方法 values()返回的数组缓存起来复用。