Является ли Java "кешированием" анонимных классов?
Рассмотрим следующий код:
for(int i = 0;i < 200;i++)
{
ArrayList<Integer> currentList = new ArrayList<Integer>() {{
add(i);
}};
// do something with currentList
}
- Как Java обрабатывает класс
currentList
?
- Будет ли он рассматривать этот класс для каждого из 200 объектов?
- Будет ли это поражение производительности даже после создания первого объекта?
- Это кеширование каким-то образом?
Мне просто интересно:)
Ответы
Ответ 1
ArrayList<Integer> currentList = new ArrayList<Integer>() {{
add(i);
}};
каждый раз создает новый экземпляр анонимного класса через ваш цикл, он не переопределяет и не перезагружает класс каждый раз. Класс определяется один раз (во время компиляции) и загружается один раз (во время выполнения).
При использовании анонимных классов не наблюдается значительного повышения производительности.
Ответ 2
Компилятор преобразует любой анонимный класс в именованный внутренний класс. Таким образом, ваш код будет преобразован в нечто вроде:
class OuterClass$1 extends ArrayList<Integer> {
OuterClass$1(int i) {
super();
add(i);
}
}
for (int i = 0; i < 200; i++) {
ArrayList<Integer> currentList = new OuterClass$1(i);
}