Инициализация двойной фигурной скобкой и статический анонимный класс

Иногда для тестирования я использую быструю инициализацию "двойной скобкой", которая создает анонимный вложенный класс в Outer класс, например:

static final Set<String> sSet1 = new HashSet<String>() {
    {
        add("string1");
        add("string2");
        // ...
    }
};

Изменить Я исправляю свое ранее ошибочное утверждение, что этот пример содержит ссылку на Outer пример. Это не так, и это эффективно эквивалентно следующему:

static final Set<String> sSet2;
static {
    sSet2 = new HashSet<String>() {
        {
            add("string1");
            add("string2");
            // ...
        }
    };
}

и то и другое sSet1 а также sSet2 инициализируются анонимными вложенными классами, которые не содержат ссылок на Outer учебный класс.

Означает ли это, что эти анонимные классы по существу static nested классы?

1 ответ

Решение

Как и в связанном вопросе, на который вы ссылаетесь, обсуждается, анонимный класс технически не может быть статическим, но он может быть эффективно назван статическим, если он объявлен в статическом контексте, то есть он не имеет ссылки на внешний экземпляр.

Однако в вашем случае различий между двумя подходами определенно нет, инициализация статических полей также является статическим контекстом.

Другие вопросы по тегам