【问题标题】:Will referring to a single ClientBundle class from multiple UiBinders cost anything?从多个 UiBinders 引用单个 ClientBundle 类会花费什么吗?
【发布时间】:2011-11-30 18:01:48
【问题描述】:

我有一个 ClientBundle,其中包含整个应用程序所需的 css 资源 - 默认背景颜色、常见布局模式等。

来自 GWT 的声明 design goal 是“不会因为多个 ClientBundle 资源函数引用相同的内容而受到惩罚”。我是否必须采取任何措施来避免处罚并帮助 ClientBundle 实现这一目标?

一种天真的方法是添加

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

在每个 UiBinder 文件的顶部。但是,在我的 22 万亿 UiBinder 文件中,这会创建 22 万亿 AppWideResources 实例,每个实例都有不同的冗余混淆等吗?

【问题讨论】:

    标签: gwt uibinder


    【解决方案1】:

    您可以通过这种方式或通过@UiFactory 方法执行此操作,而且都不会花费您任何额外费用。 GWT 只会实例化一个资源集一次,并与引用该集的每个文件共享该单一实例化。

    "...每次调用GWT.create()ui:with 会这样做)它都会实例化一个新对象,但是ClientBundle 中的所有资源都被初始化为静态字段,所以每个实例只是一个那些静态字段的非常轻量级的“代理”;并且 GWT 编译器最终会优化它,(几乎)就像你有一个单例实例一样。” (托马斯·布罗耶)

    【讨论】:

    • 这就是我希望的答案!谢谢!
    • 这并不完全正确,但它不会改变结论:每次调用GWT.create()ui:with 会这样做)它都会实例化一个新对象,但所有资源都在ClientBundle 被初始化为静态字段,因此每个实例只是这些静态字段的一个非常轻量级的“代理”;并且 GWT 编译器最终会优化它,(几乎)就像你有一个单例实例一样。
    • @ThomasBroyer 感谢您的澄清——这就是我的意思,我想我的执行没有你的那么清楚。我会更新我的答案以包括你的笔记。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2017-10-24
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多