静态枚举与非静态枚举

Java 中静态枚举和非静态枚举的区别是什么。

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

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;
}
}
106372 次浏览

If you're talking about nested enums, they are implicitly static by default.

According to the Java Language Specification:

Nested enum types are implicitly static. It is permissible to explicitly declare a nested enum type to be static.

All Enums are implicitly static, its just you don't need to write the static keyword. Similarly to the way all interface methods are implicitly public.

All enums are effectively static. If you have a nested enum, it is much the same as a static class.

All classes are lazily loaded (enums or otherwise) however when they are loaded they are loaded all at once. i.e. you can't have a few constants loaded but not others (except in the middle of class initialization)

Java allows certain modifiers to be implicit to avoid having to declare them all the time. This means that adding a modifier doesn't necessarily do anything other than provide a longer way of writing the same thing.

Default modifiers for

class field/method/nested class - package local, non-final, non-static

enum and nested enum - package local, final and static

interface field - public static final

interface method - public abstract

nested class in an interface - public static, non-final

Note: while static is optional for an enum it is always static. However, final cannot be set for an enum even though it is always notionally final (Technically you can have subclasses with overridden implementations for constants)

EDIT: The only place you need to use static with enum is with import static of an enum's value. Thank you @man910

As enums are inherently static, there is no need and makes no difference when using static-keyword in enums.

If an enum is a member of a class, it is implicitly static.

Interfaces may contain member type declarations. A member type declaration in an interface is implicitly static and public.

Oracle Community Forum and Discussion On This