Обойдется ли ссылка на один класс ClientBundle из нескольких UiBinder?
У меня есть один ClientBundle с ресурсами CSS, которые необходимы во всем приложении - фоновые цвета по умолчанию, общие шаблоны макетов и т. Д.
Заявленная цель разработки GWT состоит в том, чтобы "не было наказания за то, что несколько функций ресурса ClientBundle ссылаются на один и тот же контент". Нужно ли что-то делать, чтобы избежать штрафов и помочь ClientBundle реализовать эту цель?
Наивный подход будет просто добавить
<ui:with field="appWideResources"
type='com.activegrade.client.resources.appwide.AppWideResources' />
вверху каждого файла UiBinder. Но в моих 22 миллиардах файлов UiBinder это создаст 22 миллиарда экземпляров AppWideResources, каждый с разным и избыточным запутыванием и т. Д.?
1 ответ
Вы можете сделать это так или через @UiFactory
метод, и ни один не будет стоить вам ничего дополнительного. GWT будет создавать экземпляр ресурса только один раз и делиться этим экземпляром с каждым файлом, который ссылается на этот набор.
"... каждый раз, когда вы звоните GWT.create()
(который ui:with
будет делать) он будет создавать новый объект, но все ресурсы в ClientBundle
инициализируются как статические поля, поэтому каждый экземпляр является лишь очень легким "прокси" для этих статических полей; и компилятор GWT оптимизирует его в конце (почти), как если бы у вас был экземпляр синглтона." (Томас Бройер)