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
:所有小部件的基础。实现IsWidget
从asWidget()
返回自身。 Composite
:当您需要在隐藏其实现的同时创建从其他窗口小部件构建的窗口小部件时的基类。虽然您可以扩展现有的小部件,但通常最好将其隐藏在Composite
中,以便仅公开需要/想要公开的API。 Composite
是关于“组成而不是继承”和封装的。标准窗口小部件中的复合示例包括TabPanel
(根据TabBar
和DeckPanel
构建),DateBox
(根据TextBox
中的DatePicker
和PopupPanel
构建),将ValueListBox
包裹的ListBox
或将ValuePicker
包裹的CellList
。在许多情况下,假设面板接受IsWidget
子级,您可以简单地实现IsWidget
而不是扩展Composite
,但是有时拥有一个真正的Widget
很有用。 SimplePanel
一个实现AcceptsOneWidget
的面板,在使用 Activity 时用作插槽(但是您也可以轻松实现AcceptsOneWidget
插入到任何类型的面板中)话虽如此,Google最近开源了GWT-Mockito,它将Mockito插入
GWT.create()
中,并使用类加载器魔术来重写JSNI方法并删除final
修饰符,因此您可以在测试中直接使用小部件,而无需GWTTestCase
或MVP。因此,总而言之,这取决于您如何处理代码,如何构建应用程序。如果您使用MVP,请仅依赖演示者中的接口(interface)(
IsWidget
,AcceptsOneWidget
),以便您可以轻松地在测试中模拟 View 。否则,或者如果您想要一个“简化的MVP”( View 是UiBinder模板),请尝试使用GWT-Mockito进行测试并直接使用小部件。
当然,您可以在同一应用程序中混合使用这两种方法。在任何情况下,都可以将自己的窗口小部件构建为
Widget
(用于很少需要的东西),并将Composite
或IsWidget
(用于其他所有事物),而不是扩展现有的窗口小部件。关于java - GWT:AcceptsOneWidget,Composite,IsWidget,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17310828/