使用JsConstructor处理多个构造函数

时间:2018-02-05 00:22:39

标签: javascript java gwt gwt-jsinterop

我有一个包含两个构造函数的类:

@JsType
public class Dog implements Animal {
    String name;

    public Dog() { 
        this.name = "Scooby Doo";
    }

    public Dog(String name) {
        this.name = name;
    }
}

运行gwt compile [使用GWT-dev 2.8]

时出现以下错误
[ERROR] Constructor 'Dog(String)' can be a JsConstructor only if all constructors in the class are delegating to it.

我一直试图解决这个错误,并没有取得多大成功。我不知道如何委托给其他构造函数。

非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:2)

唉,JavaScript无法处理多个构造函数!你得到一个而且只有一个。

你可以做一些假装有多个东西 - 你可以检查传入的数据,并指定合理的默认值:

@JsConstructor
public Dog(@JsOptional String name) {
    if (name == null) {
        name = "Scooby Doo";
    }
    this.name = name;
}

如果你的两个构造函数在同一个位置不使用相同的类型,你必须要小心这里的类型 - 明智地使用instanceof可能会起作用(只要知道对于JS对象你正在使用JS {{ 1}},而不是java!)。另一个选项让您更灵活,但同样没有重载方法 - 工厂方法:

instanceof

同一主题的另一个想法是创建一个JsType构建器。这对JS来说有点不那么惯用了。

最后,您可以考虑可怕的“选项对象”,其中您的一个构造函数接受带有属性的单个Object,或者保存所有可能值的public static Dog withName(String name) { return new Dog(name); } public static Doc defaultImpl() { return new Dog(); } @JsIgnore public Dog() {/*...*/} @JsIgnore public Dog(String name) {/*...*/} ,然后检查巨型构造函数中的nullness和类型。我个人避免这个 - 这是我希望通过首先编写Java来避免的可怕事情之一。