Статическое перечисление против нестатического перечисления

Какая разница между статическим и нестатическим перечислением в 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;
    }
}

Ответ 1

Все enum эффективны static. Если у вас есть вложенное перечисление, это почти то же самое, что и static class.

Все классы лениво загружаются (перечисления или иначе), однако, когда они загружаются, они загружаются сразу. то есть вы не можете загружать несколько констант, но не другие (кроме середины инициализации класса).

Java позволяет некоторым модификаторам быть скрытыми, чтобы не было необходимости объявлять их все время. Это означает, что добавление модификатора не обязательно должно делать ничего, кроме предоставления более длительного способа написания одной и той же вещи.

Модификаторы по умолчанию для

класс/метод/вложенный класс - пакет локальный, не конечный, нестатический

enum и вложенный enum - пакет локальный, окончательный и статический

поле интерфейса - public static final

интерфейс - public abstract

вложенный класс в интерфейсе - public static, не заключительный

Примечание: в то время как static является необязательным для enum, он всегда статичен. Тем не менее, final не может быть установлен для перечисления, даже если он всегда имеет значение final (технически вы можете иметь подклассы с переопределенными реализациями для констант)

EDIT: Единственное место, где вам нужно использовать static с enum, с import static значения перечисления. Спасибо @man910

Ответ 2

Если вы говорите о вложенных перечислениях, они неявно static по умолчанию.

В соответствии с Спецификация языка Java:

Вложенные типы перечислений неявно статичны. Допустимо явно объявить вложенный тип перечисления статическим.

Ответ 3

Все перечисления неявно статичны, просто вам не нужно писать ключевое слово static. Аналогично тому, как все методы интерфейса неявно публичны.

Ответ 4

Поскольку enums являются inherently static, нет необходимости и не имеет значения при использовании static-keyword в enums.

Если перечисление является членом класса, оно неявно статично.

Интерфейсы могут содержать объявления типов участников. Объявление типа элемента в интерфейсе неявно статично и общедоступно.

Форум сообщества Oracle и обсуждение по этому вопросу