gpt4 book ai didi

java - 在包含 ClientBundle 中拥有成员 ClientBundle 是一种好的做法吗?

转载 作者:行者123 更新时间:2023-12-02 06:27:38 26 4
gpt4 key购买 nike

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

我的问题:由于 MyAppResources 是单例(正如其他文章中提到的,它不一定是单例),但 CellTableResources 不是,并且 CellTableResources 是此实例的成员,是一个也扩展 ClientBundle 的接口(interface),是否会在每个 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();

//...
}

感谢您的阅读。

最佳答案

问题由多个部分组成,因此我将尝试分几个部分来解决这个问题:

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

大多数 GWT 类都是“魔法”,您无法以其他方式为自己编写这些内容,因为它们会调用编译器为您填写特定的详细信息。在开发模式下运行与编译为 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 实例没有用于跟踪新创建对象的字段,而是具有它们使用的静态成员 - 有效的单例。这意味着一旦您调用了一个方法一次,它返回的实例将与您下次调用它时创建的实例相同。具有相同内容的两个不同的 ClientBundle 当然会保留对象的两个不同副本,但创建 ClientBundle 多少次并不重要 - 它的内部结构将始终是相同的。

还有什么吗?

是的!请记住,您在这里处理的是接口(interface),而不是类,因此您实际上可以一次扩展多次!

public interface MyAppResources extends 
ClientBundle,
CellTable.Resources,
CellTree.Resources {//etc
//...

现在,如果两个接口(interface)描述相同的方法,您可能会遇到问题,但如果不是,这可以在生成 Sprite 图像时提供优势。每个单独的 ClientBundle 在准备使用时都会使用自己的图像池 - 如果您在 ClientBundle 中有一个 ClientBundle,它们就不会'共同努力将图像分解成更大的 block 。为此,您只需创建一种 ClientBundle 类型。这对于您的具体情况可能并不重要,但我认为这也值得一提。

关于java - 在包含 ClientBundle 中拥有成员 ClientBundle 是一种好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com