Java "кеширует" анонимные классы? - PullRequest
10 голосов
/ 12 января 2010

Рассмотрим следующий код:

for(int i = 0;i < 200;i++)
{
  ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
  // do something with currentList
}
  • Как Java будет относиться к классу currentList?
  • Будет ли это рассматриваться как отдельный класс для каждого из 200 объектов?
  • Будет ли снижение производительности даже после создания первого объекта?
  • Это как-то кеширует?

Мне просто любопытно:)

Ответы [ 2 ]

15 голосов
/ 12 января 2010

Компилятор собирается преобразовать любой анонимный класс в именованный внутренний класс. Таким образом, ваш код будет преобразован во что-то вроде:

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);
}
15 голосов
/ 12 января 2010
ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};

создает новый экземпляр анонимного класса каждый раз в вашем цикле, это не переопределение или перезагрузка класса каждый раз Класс определяется один раз (во время компиляции) и загружается один раз (во время выполнения).

Нет значительного снижения производительности при использовании анонимных классов.

...