Насколько вредны двойные скобки в GWT? - PullRequest
5 голосов
/ 11 марта 2012

Я склонен использовать (или даже злоупотреблять) двойную фигурную скобку для инициализации объекта в GWT.Для меня это выглядит более читабельным и более декларативным.

new FastMap<Object>(){{
    put("Value", 12);
    put("Unit", "Kg");
}};

До сегодняшнего дня я не знал, что этот синтаксис не просто создает объект, но и создает для него AnonymousInnerClass .Теперь меня беспокоит, как GWT справится с ними.

  1. Как этот синтаксис влияет на производительность выполнения?
  2. Как этот синтаксис влияет на компилируемый размер?
  3. Есть ли что-то плохое?* В моем приложении тысячи таких инициализаций.

Ответы [ 4 ]

5 голосов
/ 11 марта 2012

Мои выводы. Тест код . Я создаю единый список из 4 карт по 21 предмету в каждой. Я измеряю размер всех сгенерированных файлов JavaScript. Результаты:

Пусто (просто пустой код, чтобы убедиться, что код поддержки GWT отображается):

  • PRETTY = 533 КБ (546 602 байта)
  • OBF = 212 КБ (217 601 байт)
  • Количество new = 167

Код без двойных скобок :

  • PRETTY = 557 КБ (570 682 байта)
  • OBF = 222 КБ (227 663 байта)
  • Количество new = 171

И тот же код с двойными скобками :

  • PRETTY = 567 КБ (581 004 байта)
  • OBF = 228 КБ (234 089 байт)
  • Количество new = 177

Я думаю, что результаты довольно очевидны.

2 голосов
/ 11 марта 2012

Это стандартная Java и не зависит от GWT. Это всесторонне рассматривается в Эффективность Java «Двойная инициализация скобки»? .

Самая большая проблема, с которой я сталкиваюсь с этим синтаксисом, заключается в том, что он не доставляет экземпляр FastMap, а скорее его анонимный подкласс. Этот объект не сравнивается как равный с эквивалентным экземпляром FastMap с данными, установленными традиционным способом. Также вероятно, что есть другие ошибки, которые не очевидны и не так просты для отладки.


Тема здесь говорит это

Осторожно - инициализация с двойной скобкой выглядит круто, но это на порядки медленнее, чем обычная инициализация создать анонимный класс.

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

Я использую их все время в модульных тестах, но никогда в производственном коде.

1 голос
/ 11 марта 2012

Если вы просто определяете карты констант, как это, вам, вероятно, будет лучше (и по скорости, и по удобочитаемости), используя Гуава и ImmutableMap :

Map<Integer, Character> map = ImmutableMap.of(5, 'a', 1, 'b');
Map<Integer, String> largerMap = ImmutableMap.<Integer, String>builder()
  .put(1, "a")
  .put(2, "b");
  .put(5, "wisconsin")
  .build();

(Они от Google и полностью совместимы с GWT.)

1 голос
/ 11 марта 2012

Что касается читабельности: я бы изменил ее на что-то вроде этого, чтобы было легче читать:

new FastMap<Object>()
{{
    put("Value", 12);
    put("Unit", "Kg");
}};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...