2011-01-24 77 views
5

成员域为什么声明的Java枚举重要的顺序,我的意思是为什么这得(编译时)错误秩序枚举

public enum ErrorCodes { 
    public int id; 
    Undefined; 
} 

但是这一次是罚款:

public enum ErrorCodes { 
    Undefined; 
    public int id; 

}. 

回答

5

因为这是枚举的语法。它可能允许不同的命令,但是这可能会出现错误,例如忘记在字段上放置类型并将其变为枚举值。

编辑:我说他们可以以任何顺序的原因是字段,方法,初始化和构造函数可以以任何顺序。我相信如果要减少错误,限制是有效的。尽管字段/构造函数/方法可以按任何顺序排列,但为了便于阅读,它的顺序很常见。

+2

+1 - 如果订单不受限制,枚举将更难以阅读,语法将更难以解析,并且语法错误消息将不易理解。 – 2011-01-24 10:00:19

6

这不是一个非常令人满意的答案,但它只是如何在Java中定义枚举。请参阅Java语言规范中的8.9 Enums

1

Java枚举是一种特殊的类。其简单和最有用的形式不包含自定义字段:

public enum ErrorCodes { 
    Undefined, Defined, Foo, Bar 
} 

编译器魔术创建类,看起来大约类似于如下:

public class ErrorCodes { 
    public final static ErrorCodes Undefined = new ErrorCodes(); 
    public final static ErrorCodes Defined = new ErrorCodes(); 
    public final static ErrorCodes Foo = new ErrorCodes(); 
    public final static ErrorCodes Bar = new ErrorCodes(); 
} 

这个编译器魔法预计枚举头之后的字段定义权。

太阳是如此友好,让我们添加这样的字段,遵循eunum成员的定义: public enum ErrorCodes { Undefined,Defined,Foo,Bar; private String myField; }

这就是您的自定义代码总是必须定义之后的枚举字段的原因。

+0

这不是“编译器魔力”......它是常见的或花园式的“语法”。 – 2011-01-24 10:02:44