我有一个ClientBundle,其中包含整个应用程序所需的css资源 - 默认背景颜色,常见布局模式等。
来自GWT的陈述design goal是“对多个ClientBundle资源函数引用相同内容没有任何惩罚”。我是否必须做任何事情以避免处罚并帮助ClientBundle实现这一目标?
一种天真的方法就是添加
<ui:with field="appWideResources"
type='com.activegrade.client.resources.appwide.AppWideResources' />
位于每个UiBinder文件的顶部。但是,在我的22亿UiBinder文件中,这将创建22亿个AppWideResources实例,每个实例都有不同的冗余混淆等等吗?
答案 0 :(得分:5)
你可以这样做或通过@UiFactory
方法,也不会花费任何额外的费用。 GWT只会实例化一次资源集,并与引用该集合的每个文件共享该单个实例。
“......每次调用GWT.create()
(ui:with
将执行此操作)时,它将实例化一个新对象,但ClientBundle
中的所有资源都被初始化为静态字段,所以每个实例只是那些静态字段的一个非常轻量级的“代理”;而GWT编译器最终会优化它,(几乎)就好像你有一个单例实例一样。“ (Thomas Broyer)