首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个包含ClientBundle的ClientBundle中有一个成员ClientBundle是一个好的实践吗?

在一个包含ClientBundle的ClientBundle中有一个成员ClientBundle是一个好的实践吗?
EN

Stack Overflow用户
提问于 2013-12-04 17:54:06
回答 1查看 71关注 0票数 0

在我的应用程序中,我有MyAppResources,它将主要包含应用程序的自定义样式。我正在考虑如何将自定义样式应用于标准小部件(如CellTable )以及布局和自定义小部件上的自定义样式?

我的问题:既然MyAppResources是一个单例(不必像其他帖子中提到的那样),但是CellTableResources不是,而且CellTableResources是这个实例的成员,它也是一个扩展ClientBundle的接口,会在每个MyAppResources.INSTANCE.cellTableResources().foo()上创建一个代理'CellTableResources‘吗?

如果是这样的话,我可以创建一个MyAppResources.CELLTABLE_RESOURCE_INSTANCE来解决这个问题吗?或者代理的创建是可以忽略不计的,即使有大量对MyAppResources.INSTANCE.cellTableResources().#的调用。

第二,更多的讨论问题:在这种情况下,使用多个ClientBundle的最佳实践是什么?我应该单独使用CellTableResources (从MyAppResources中删除它),在需要它的小部件中使用GWT.create(CellTableResources.class); (或者像使用MyAppResources那样使用单例)吗?

MyAppResources

代码语言:javascript
复制
public interface MyAppResources extends ClientBundle {
    public static final MyAppResources INSTANCE =  GWT.create(MyAppResources.class);

    @Source("MyAppStyles.css")
    public MyAppCssResource css();

    public CellTableResources cellTableResources();

}

CellTableResources

代码语言:javascript
复制
public interface CellTableResources extends CellTable.Resources {

    interface CellTableStyle extends CellTable.Style {
    }

    @Override
    @Source({ CellTable.Style.DEFAULT_CSS, "CellTableStyles.css" })
    CellTableStyle cellTableStyle();

    @Source("green_light.png")
    ImageResource getGreenLight();

    //...
}

感谢您的阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-04 23:03:21

多部分的问题,所以我试着用几个部分来讨论这个问题:

GWT.create()的成本是多少?

大多数GWT类都是“神奇的”,您无法用其他方式为自己编写这些东西,因为它们要求编译器为您填写特定的细节。当在dev模式和编译到JS的情况下运行时,它们通常是不同的。

GWT.create的例子中,它被编译成new --它只是用来创建新的实例。那么,新实例相对于单个实例的成本是多少?这完全取决于正在创建的对象。如果对象中没有字段,那么成本基本上是免费的--事实上,编译器可能会选择实际删除构造函数调用,并将所有后续方法重写为static

在大多数情况下都会发生这种情况-- GWT.create应该被认为是非常便宜的,除非您做了一些愚蠢的事情,比如在一个循环中多次调用它。

当我在另一个ClientBundle中列出一个ClientBundle方法时会发生什么?

那么,当您列出ClientBundle中的任何内容时,会发生什么?

可以在ClientBundle中列出的任何内容都必须用@ResourceGeneratorType注释,指示如何生成该类型。例如,下面是ImageResource

代码语言:javascript
复制
/**
 * Provides access to image resources at runtime.
 */
@DefaultExtensions(value = {".png", ".jpg", ".gif", ".bmp"})
@ResourceGeneratorType(ImageResourceGenerator.class)
public interface ImageResource extends ResourcePrototype {
//...

它要求ImageResourceGenerator根据需要创建图像。注释中描述的任何类都必须实现com.google.gwt.resources.ext.ResourceGenerator,它描述了如何准备工作、如何创建必要的字段、如何初始化字段以及如何完成。

那么,这对于ClientBundle本身来说是什么样的呢?查看com.google.gwt.resources.rg.BundleResourceGenerator --它是一个非常简单的类,它只对给定方法的类型调用GWT.create()。因此,可以预见,这意味着这些“子”ClientBundles是通过GWT.create创建的,与您可能做的大致相同。

好吧,在这个特殊情况下这意味着什么?

事实证明,ClientBundles实例没有跟踪新创建的对象的字段,而是使用静态成员--实际上是单例。这意味着,一旦调用了一次方法,它返回的实例将与下次调用时创建的实例相同。当然,两个具有相同内容的不同ClientBundles将保留两个不同的对象副本,但不管您创建了多少次ClientBundle --它的内部结构总是相同的。

还要别的吗?

是啊!请记住,您在这里处理的是接口,而不是类,因此您实际上可以一次不止一次地进行扩展!

代码语言:javascript
复制
public interface MyAppResources extends 
       ClientBundle, 
       CellTable.Resources, 
       CellTree.Resources {//etc
  //...

现在,如果两个接口描述相同的方法,您可能会遇到问题,但如果不是,这可以提供一个优势时,生成短跑图像。每个单独的ClientBundle在准备使用时都会使用自己的映像池--如果您在ClientBundle中有一个ClientBundle,它们就不会一起工作,将图像变成更大的片段。要做到这一点,您只需要创建一个ClientBundle类型。这在你的特殊情况下可能不重要,但我想这也是值得一提的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20382448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档