在我的应用程序中,我有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
public interface MyAppResources extends ClientBundle {
public static final MyAppResources INSTANCE = GWT.create(MyAppResources.class);
@Source("MyAppStyles.css")
public MyAppCssResource css();
public CellTableResources cellTableResources();
}CellTableResources
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();
//...
}感谢您的阅读。
发布于 2013-12-04 23:03:21
多部分的问题,所以我试着用几个部分来讨论这个问题:
GWT.create()的成本是多少?
大多数GWT类都是“神奇的”,您无法用其他方式为自己编写这些东西,因为它们要求编译器为您填写特定的细节。当在dev模式和编译到JS的情况下运行时,它们通常是不同的。
在GWT.create的例子中,它被编译成new --它只是用来创建新的实例。那么,新实例相对于单个实例的成本是多少?这完全取决于正在创建的对象。如果对象中没有字段,那么成本基本上是免费的--事实上,编译器可能会选择实际删除构造函数调用,并将所有后续方法重写为static!
在大多数情况下都会发生这种情况-- GWT.create应该被认为是非常便宜的,除非您做了一些愚蠢的事情,比如在一个循环中多次调用它。
当我在另一个ClientBundle中列出一个ClientBundle方法时会发生什么?
那么,当您列出ClientBundle中的任何内容时,会发生什么?
可以在ClientBundle中列出的任何内容都必须用@ResourceGeneratorType注释,指示如何生成该类型。例如,下面是ImageResource
/**
* 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 --它的内部结构总是相同的。
还要别的吗?
是啊!请记住,您在这里处理的是接口,而不是类,因此您实际上可以一次不止一次地进行扩展!
public interface MyAppResources extends
ClientBundle,
CellTable.Resources,
CellTree.Resources {//etc
//...现在,如果两个接口描述相同的方法,您可能会遇到问题,但如果不是,这可以提供一个优势时,生成短跑图像。每个单独的ClientBundle在准备使用时都会使用自己的映像池--如果您在ClientBundle中有一个ClientBundle,它们就不会一起工作,将图像变成更大的片段。要做到这一点,您只需要创建一个ClientBundle类型。这在你的特殊情况下可能不重要,但我想这也是值得一提的。
https://stackoverflow.com/questions/20382448
复制相似问题