Как установить значение по умолчанию для @JsProperty? - PullRequest
0 голосов
/ 30 августа 2018

Я создаю оболочку Jsinteropted для исходных объектов Mapbox-gl-js .

У меня есть абстрактный класс Source, который встраивает методы по умолчанию, такие как получение / установка типа источника.

@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class Source {

    @JsProperty
    protected final native String getType();

    @JsProperty
    protected final native void setType(String type);

}

И у меня есть некоторый унаследованный класс, который должен (согласно документации Mapbbox) определять свойство type! Поэтому я хотел бы сделать что-то вроде:

@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class GeoJsonSource extends Source {

    @JsConstructor
    public GeoJson() {
        setType("geojson");
    }

}

или

@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class GeoJsonSource extends Source {

    @JsProperty
    private String type = "geojson";

}

Но оба запрещены компилятором GWT.

Сейчас я использую фабрику, которая создает GeoJsonSource, а затем задает правильное свойство type, но мне интересно, есть ли способ сделать это с помощью Jsinteropt?

1 Ответ

0 голосов
/ 30 августа 2018

Как установить значение по умолчанию для чужого типа? Вы не.

Помните, что вы сказали компилятору, что вы просто описываете объект класса js - если есть значения по умолчанию, они уже существуют.

Подумайте, как бы вы сделали это в JS - обычно это будет просто {type:"geojson"} или var obj = {}; obj.type = "geojson";, чтобы выполнить два необходимых шага: а) создание простого объекта и б) назначение некоторого типа, который должен быть по умолчанию .

Сработает фабрика, возможно, статический метод в GeoJsonSource, так что понятно, что вы делаете.


Другой вариант - не помечать тип GeoJsonSource как native и не давать ему имя Object в глобальном пространстве имен (т. Е. Вам не разрешено переписывать чужие данные), если это подходит для вашего вариант использования. Теперь это позволит вам управлять классом - определять значения по умолчанию, добавлять логику в конструкторы и тому подобное, но вы должны убедиться, что методы экспортируются правильно.

Ограничения этого подхода включают тот факт, что любой объект, считываемый из строки JSON, не будет вашим типом GeoJsonSource (но, с другой стороны, это может не иметь значения, поскольку он, вероятно, уже имеет свойство type. Логика все равно будет тем не менее, отсутствует в его методах, поскольку чтение из JSON всегда создает простые экземпляры Object (если вы не передаете функцию reviver в JSON.parse()).

Аналогично, простой Объект, переданный из JS или прочитанный из JSON.parse(), не будет правильно проходить проверку instanceof на ваш не нативный тип, что может потребовать от вас использования Js.uncheckedCast в некоторых местах, где вы обычно пишете идиоматическая Java.


Поскольку вы создаете обертку (которая, вероятно, будет использоваться другими, которые могут не обязательно понимать эти ограничения так же полно, как вы), я бы предпочел заводской подход - да, он требует немного больше настроек для вашего с другой стороны, но в более простом JS понятнее то, о чем вы просите, и он будет вести себя более предсказуемо, если кто-то будет рассматривать простой JS-объект как Java GeoJsonSource (поскольку он равен один).

...