GWT有很多名称相似(目的相似)的类型:

  • Widget
  • AcceptsOneWidget
  • Composite
  • IsWidget
  • SimplePanel

  • 何时/何地使用这些功能?它们与RootPanel有什么关系?

    最佳答案

    首先让我们从类中分离接口(interface)。

    接口(interface)非常适合模拟(因此无需迟缓的GWTTestCase即可测试您的应用程序):

  • IsWidget:当您只需要一个小部件上的句柄时,而不必依赖于Widget类。这通常与MVP一起使用,以表示 View 。
  • AcceptsOneWidget:当您需要单个小部件的占位符时(以IsWidget的形式)。这通常与Activity一起使用,以将 View (IsWidget)插入给定的插槽(AcceptsOneWidget)。

  • 您列出的类都扩展了Widget,因此它们依赖于JSNI,并且(大多数时候)需要在GWT环境中运行(对于单元测试,这意味着GWTTestCase):
  • Widget:所有小部件的基础。实现IsWidgetasWidget()返回自身。
  • Composite:当您需要在隐藏其实现的同时创建从其他窗口小部件构建的窗口小部件时的基类。虽然您可以扩展现有的小部件,但通常最好将其隐藏在Composite中,以便仅公开需要/想要公开的API。 Composite是关于“组成而不是继承”和封装的。标准窗口小部件中的复合示例包括TabPanel(根据TabBarDeckPanel构建),DateBox(根据TextBox中的DatePickerPopupPanel构建),将ValueListBox包裹的ListBox或将ValuePicker包裹的CellList。在许多情况下,假设面板接受IsWidget子级,您可以简单地实现IsWidget而不是扩展Composite,但是有时拥有一个真正的Widget很有用。
  • SimplePanel一个实现AcceptsOneWidget的面板,在使用 Activity 时用作插槽(但是您也可以轻松实现AcceptsOneWidget插入到任何类型的面板中)

  • 话虽如此,Google最近开源了GWT-Mockito,它将Mockito插入GWT.create()中,并使用类加载器魔术来重写JSNI方法并删除final修饰符,因此您可以在测试中直接使用小部件,而无需GWTTestCase或MVP。

    因此,总而言之,这取决于您如何处理代码,如何构建应用程序。如果您使用MVP,请仅依赖演示者中的接口(interface)(IsWidgetAcceptsOneWidget),以便您可以轻松地在测试中模拟 View 。
    否则,或者如果您想要一个“简化的MVP”( View 是UiBinder模板),请尝试使用GWT-Mockito进行测试并直接使用小部件。
    当然,您可以在同一应用程序中混合使用这两种方法。在任何情况下,都可以将自己的窗口小部件构建为Widget(用于很少需要的东西),并将CompositeIsWidget(用于其他所有事物),而不是扩展现有的窗口小部件。

    关于java - GWT:AcceptsOneWidget,Composite,IsWidget,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17310828/

    10-10 03:45