静态枚举与非静态枚举

Java中的静态和非静态枚举有什么区别? 两种用法都是一样的。

这是正确的吗? 所有静态的都会在启动时加载到内存中,而非静态的会按需加载 如果是,那么哪种方法更好? 保持一些数据总是在内存中或使用服务器资源来加载它们每次?

public class Test { public enum Enum1 { A, B } public static enum Enum2 { C, D } public static void main(String[] args) { Enum1 a = Enum1.A; Enum1 b = Enum1.B; Enum2 c = Enum2.C; Enum2 d = Enum2.D; } } 

所有的enum都是有效的static 。 如果你有一个嵌套枚举,它和static class非常相似。

所有的类都是lazily加载(枚举或其他),但是当他们被加载时,他们一次加载。 即你不能有一些常量加载,但不是其他人(除了在类初始化中)

Java允许某些修饰符是隐式的,以避免必须一直声明它们。 这意味着添加一个修饰符不一定能够提供更长的写法。

默认修饰符

类字段/方法/嵌套类 – 包本地,非最终,非静态

枚举和嵌套枚举 – 包本地,最终和静态

接口字段 – public static final

接口方法 – public abstract

在一个接口嵌套类 – public static ,非最终

注意:虽然static对于enum是可选的,但它始终是静态的。 然而, final不能为一个枚举设置,即使它总是名义上final (技术上你可以有重载的常量实现的子类)

编辑:你需要使用enum static的唯一的地方是import static的枚举值。 谢谢@ man910

如果您正在讨论嵌套枚举,那么默认情况下它们是隐式static的。

根据Java语言规范 :

嵌套的枚举types是隐式静态的。 允许显式声明一个嵌套的枚举types是静态的。

所有的枚举都是隐式静态的,只是你不需要写static关键字。 与所有接口方法隐式公开的方式类似。

由于enums inherently static ,因此在enums使用static-keyword时没有必要也没有区别。

如果枚举是类的成员,则它是隐式静态的。

接口可能包含成员types声明。 接口中的成员types声明是隐式静态的,也是公有的。

Oracle社区论坛及其讨论