Инициализация двойной фигурной скобкой и статический анонимный класс
Иногда для тестирования я использую быструю инициализацию "двойной скобкой", которая создает анонимный вложенный класс в 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 ответ
Как и в связанном вопросе, на который вы ссылаетесь, обсуждается, анонимный класс технически не может быть статическим, но он может быть эффективно назван статическим, если он объявлен в статическом контексте, то есть он не имеет ссылки на внешний экземпляр.
Однако в вашем случае различий между двумя подходами определенно нет, инициализация статических полей также является статическим контекстом.