Обойдется ли ссылка на один класс ClientBundle из нескольких UiBinder? - PullRequest
4 голосов
/ 30 ноября 2011

У меня есть один ClientBundle с ресурсами CSS, необходимыми для всего приложения - фоновые цвета по умолчанию, общие шаблоны макетов и т. Д.

Заявленная цель разработки от GWT заключается в том, что существует«Нет наказания за то, что несколько функций ресурса ClientBundle ссылаются на один и тот же контент».Нужно ли что-либо делать, чтобы избежать штрафов и помочь ClientBundle реализовать эту цель?

Наивным подходом было бы просто добавить

<ui:with field="appWideResources"
    type='com.activegrade.client.resources.appwide.AppWideResources' />

вверху каждого файла UiBinder.Но в моих 22 миллионах файлов UiBinder это создаст 22 миллиарда экземпляров AppWideResources, каждый с разным и избыточным запутыванием и т. Д.?

1 Ответ

5 голосов
/ 30 ноября 2011

Вы можете сделать это таким образом или с помощью метода @UiFactory, и ни один из них не будет стоить вам ничего дополнительного.GWT будет создавать экземпляр ресурса только один раз и делиться этим экземпляром с каждым файлом, который ссылается на этот набор.

"... каждый раз, когда вы вызываете GWT.create() (что будет делать ui:with), он будет создавать экземплярновый объект, но все ресурсы в ClientBundle инициализируются как статические поля, поэтому каждый экземпляр является лишь очень легким «прокси» для этих статических полей, и компилятор GWT в конечном итоге оптимизирует его (почти) какесли бы у вас был экземпляр синглтона. "(Томас Бройер)

...