静态枚举与非静态枚举
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社区论坛及其讨论