我可以同时使用默认构造函数和@UiConstructor 吗?
Can I use default constructor and @UiConstructor simultaneously?
如果我创建一个带有两个构造函数的 GWT 小部件:一个默认构造函数和另一个用 @UiConstructor 注释的构造函数 - 是否可以在 ui.xml 模板中同时使用这两个构造函数?或者 @UiConstructor 注释的存在是否意味着绝对没有办法使用任何其他构造函数?
@UiConstructor
的规范(可在 here 中找到)说
[@UiConstructor
] Marks a constructor that may be used as an alternative to a widget's zero args construtor in a UiBinder template. The parameter names of the constructor may be filled as xml element attribute values.
因此,根据规范,您似乎可以拥有一个零参数构造函数,and/or 一个带注释的构造函数,其参数可以通过 xml 指定。除此之外,你不能有超过一个带注释的构造函数,因为在这种情况下 UiBinder 应该选择正确的构造函数。对于任何其他构造函数,我认为它将被忽略。
事实证明答案是否定的:如果任何构造函数标有@UiConstructor,那么您必须完全根据该单个构造函数编写 ui.xml 模板。测试小部件 class:
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.user.client.ui.Label;
public class UiConstructorTest extends Label {
public UiConstructorTest() {
setText("default constructor");
}
@UiConstructor
public UiConstructorTest(String text) {
setText(text);
}
}
省略参数会导致像这样的 UiBinder 错误(而不是调用默认构造函数):
00:00:15,072 [ERROR] <my:UiConstructorTest ui:field='testLabel'> missing required attribute(s): text: <my:UiConstructorTest ui:field='testLabel'> (:14)
当然,小部件仍然可以有其他构造函数。该限制仅意味着您将无法在 ui.xml 模板中使用它们中的任何一个(带注释的模板除外)。默认构造函数也不例外。
我想如果可以同时使用带注释的构造函数和默认构造函数,那将导致混乱的情况。例如,如果我们有一个带有默认构造函数的小部件,一个带有 String 文本参数的 UiConstructor 和一个 setText(String text) setter,这个模板声明将是模棱两可的:
<my:UiConstructorTest ui:field='testLabel' text="isThisAConstructorParameterOrASetterParameter?">
UiBinder 应该用 UiConstructor 标记的构造函数实例化吗?或者它应该使用默认构造函数,然后调用 setter?
如果我创建一个带有两个构造函数的 GWT 小部件:一个默认构造函数和另一个用 @UiConstructor 注释的构造函数 - 是否可以在 ui.xml 模板中同时使用这两个构造函数?或者 @UiConstructor 注释的存在是否意味着绝对没有办法使用任何其他构造函数?
@UiConstructor
的规范(可在 here 中找到)说
[@UiConstructor
] Marks a constructor that may be used as an alternative to a widget's zero args construtor in a UiBinder template. The parameter names of the constructor may be filled as xml element attribute values.
因此,根据规范,您似乎可以拥有一个零参数构造函数,and/or 一个带注释的构造函数,其参数可以通过 xml 指定。除此之外,你不能有超过一个带注释的构造函数,因为在这种情况下 UiBinder 应该选择正确的构造函数。对于任何其他构造函数,我认为它将被忽略。
事实证明答案是否定的:如果任何构造函数标有@UiConstructor,那么您必须完全根据该单个构造函数编写 ui.xml 模板。测试小部件 class:
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.user.client.ui.Label;
public class UiConstructorTest extends Label {
public UiConstructorTest() {
setText("default constructor");
}
@UiConstructor
public UiConstructorTest(String text) {
setText(text);
}
}
省略参数会导致像这样的 UiBinder 错误(而不是调用默认构造函数):
00:00:15,072 [ERROR] <my:UiConstructorTest ui:field='testLabel'> missing required attribute(s): text: <my:UiConstructorTest ui:field='testLabel'> (:14)
当然,小部件仍然可以有其他构造函数。该限制仅意味着您将无法在 ui.xml 模板中使用它们中的任何一个(带注释的模板除外)。默认构造函数也不例外。
我想如果可以同时使用带注释的构造函数和默认构造函数,那将导致混乱的情况。例如,如果我们有一个带有默认构造函数的小部件,一个带有 String 文本参数的 UiConstructor 和一个 setText(String text) setter,这个模板声明将是模棱两可的:
<my:UiConstructorTest ui:field='testLabel' text="isThisAConstructorParameterOrASetterParameter?">
UiBinder 应该用 UiConstructor 标记的构造函数实例化吗?或者它应该使用默认构造函数,然后调用 setter?