3

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

@JsType
public class Dog implements Animal {
    String name;

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

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

运行 gwt compile [With GWT-dev 2.8] 时出现以下错误

[ERROR] Constructor 'Dog(String)' can be a JsConstructor only if all constructors in the class are delegating to it.

我一直在努力解决这个错误,但没有太大成功。我不确定如何委托给其他构造函数。

很感谢任何形式的帮助!

谢谢!

4

1 回答 1

2

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

您可以做一些事情来假装拥有不止一个 - 您可以检查传入的数据,并分配合理的默认值:

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

如果您的两个构造函数在同一位置不使用相同的类型,则必须注意此处的类型 - 明智地使用instanceof可能会起作用(请注意,对于 JS 对象,您使用的是 JS instanceof,而不是 java!)。另一个选项让您更灵活,但同样没有重载方法 - 工厂方法:

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) {/*...*/}

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

最后,您可以考虑可怕的“选项对象”,其中您的一个构造函数采用具有属性的单个对象,或者一个包含JsPropertyMap<Any>所有可能值的对象,然后检查巨型构造函数中的空值和类型。我个人避免这种情况——这是我希望通过首先编写 Java 来避免的可怕事情之一。

于 2018-02-05T03:50:58.353 回答