Использование JsConstructor для работы с несколькими конструкторами

У меня есть класс с двумя конструкторами:

@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.

Я пытался справиться с этой ошибкой, но без особого успеха. Я не уверен, как делегировать другому конструктору.

Любая помощь очень ценится!

Спасибо!

1 ответ

Увы, JavaScript не может обрабатывать несколько конструкторов! Вы получаете один и только один.

Есть несколько вещей, которые вы можете сделать, чтобы притвориться, что их более одного - вы можете проверить входящие данные и назначить разумные значения по умолчанию:

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

Вы должны быть осторожны с типами здесь, если ваши два конструктора не используют одни и те же типы в одном и том же положении - разумное использование instanceof может работать (просто знайте, что для объектов JS вы используете JS instanceofне ява!) Другой вариант позволяет вам быть более гибким, но опять же, нет перегруженных методов - заводские методы:

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.

Другие вопросы по тегам