Java 枚举类型原理分析为什么枚举比用静态变量多消耗两倍的内存
参考文章:Java 枚举类型原理分析为什么枚举比用静态变量多消耗两倍的内存
定义个枚举
package com.example.xu.mycustomviewdemo;
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY;
private Week() {
}
}
编译之后:
package com.example.xu.mycustomviewdemo;
public final class Week extends Enum
{
public static Week[] values()
{
return (Week[])$VALUES.clone();
}
public static Week valueOf(String name)
{
return (Week)Enum.valueOf(com/example/xu/mycustomviewdemo/Week, name);
}
private Week(String s, int i)
{
super(s, i);
}
public static final Week MONDAY;
public static final Week TUESDAY;
public static final Week WEDNESDAY;
public static final Week THURSDAY;
public static final Week FRIDAY;
private static final Week $VALUES[];
static
{
MONDAY = new Week("MONDAY", 0);
TUESDAY = new Week("TUESDAY", 1);
WEDNESDAY = new Week("WEDNESDAY", 2);
THURSDAY = new Week("THURSDAY", 3);
FRIDAY = new Week("FRIDAY", 4);
$VALUES = (new Week[] {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
});
}
}
从反编译的代码来看,我们定义的枚举,编译器会将其转换成一个类,这个类继承自java.lang.Enum类,除此之外,编译器还会帮我们生成多个枚举类的实例,赋值给我们定义的枚举类型常量【即static包里】,并且还声明了一个枚举对象的数组,保存了所有的枚举对象。生成的诸多对象,对象数组,远比静态变量占据内存多。
Java annotation 怎么替代枚举
定义
@IntDef({NewWeek.MONDAY, NewWeek.TUESDAY})
@Retention(RetentionPolicy.SOURCE)
public @interface NewWeek {
public static final int MONDAY = 0;
public static final int TUESDAY = 1;
}
使用
private void setEnum(@NewWeek int week){
。。
}