Использование 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.