单个类文件定义了类或接口。纵观结构(https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html):
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
一个ENUM是一个类,如果你看它编译成,你就会明白为什么有必要开销(在这里看到:In java, What does such enum type compile to?)。一个接口是一个抽象类型,它实际上只是一个类必须符合的一组操作和常量。
ICompany.class:
����4
CAPITAL_ONELjava/lang/String;
ConstantValue
SourceFile
ICompany.javaICompanyjava/lang/ObjectCapital_One
ECompany.class:
����4(
!
"
" #$CAPITAL_ONE
LECompany;$VALUES[LECompany;values
()[LECompany;CodeLineNumberTablevalueOf(Ljava/lang/String;)LECompany;<init>(Ljava/lang/String;I)V Signature()V<clinit>Ljava/lang/Enum<LECompany;>;
SourceFile
ECompany.java
%&ECompany'java/lang/Enumclone()Ljava/lang/Object;5(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;@1
@
"
���� "
*���*+��7�Y�� �Y� S��
从类文件中,你可以看到,在示例中的界面没有太多添加到它的条款方法或标志,因此更小的尺寸。
也许是因为那些不是等价的数据结构? –
接口只需要有一个字段名称,类型和值。除了常量值之外,枚举需要存储多个不同的方法实现('values()'和'valueOf(String)',以及静态初始化)。 – resueman