javascript - 使用JsConstructor处理多个构造函数

标签 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.

我一直在努力解决这个错误,但收效甚微。我不确定如何委托(delegate)给其他构造函数。

非常感谢任何帮助!

谢谢!

最佳答案

唉,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 来避免的可怕事情之一。

关于javascript - 使用JsConstructor处理多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614354/

相关文章:

java.lang.NoClassDefFoundError : java. rmi.server.UID 是受限类

java - 如何使监听器在 CellColumn getValue gwt 中工作?

javascript - 将鼠标悬停在一个上时,将同一父级的所有先前 li 悬停

javascript - 从不同字段以不同形式向服务器提交数据

javascript - 为什么这段 Javascript 代码会自动运行?

java - FindBugs 不检测 SQL 注入(inject)

javascript - jQuery 事件监听器多次触发

java - 使用 java 连接由 Pipe 和 ':' 分隔的整数值

java - 像在 Java 中一样在 Delphi Xe2 的控制台中打印

java - GWT UIBinder 方法返回类型 void?