如何为@JsProperty设置默认值?

时间:2018-08-30 09:33:04

标签: java gwt gwt-jsinterop

我正在为Mapbox-gl-js的源对象构建Jsinteropted包装器。

我有一个抽象类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 :(得分:2)

如何为其他人的类型设置默认值?你没有。

请记住,您已经告诉编译器您只是在描述js类Object-如果存在默认值,则它们已经存在。

考虑如何在JS中执行此操作-通常只需{type:"geojson"}var obj = {}; obj.type = "geojson";即可完成以下两个必需步骤:a)创建一个纯对象,b)分配一些必须默认情况下在那里。

工厂可以工作,也许是GeoJsonSource中的静态方法,所以很清楚您在做什么。


另一种选择是不将GeoJsonSource类型标记为native,并且在适当的情况下不要在全局名称空间中给它命名为Object的名称(即,不允许您重写其他人的数据)为您的用例。现在,您可以控制类-定义默认值,在构造函数中添加逻辑等,但必须确保正确导出方法。

此方法的局限性在于,从JSON字符串读取的任何对象都将不是您的GeoJsonSource类型(但另一方面,这可能无关紧要,因为它可能已经具有type属性。但是,由于从JSON读取总是创建简单的Object实例(除非您将reviver函数传递给JSON.parse()),因此其方法仍然会丢失。

类似地,从JS传递或从JSON.parse()读取的普通对象不会正确通过针对您的非本地类型的instanceof检查,这可能需要您在某些情况下使用Js.uncheckedCast通常会编写惯用Java的地方。


由于您正在构建包装器(可能供其他人使用,他们不一定完全像您那样理解这些限制),所以我倾向于采用工厂方法-是的,它需要在您的设备上进行一些设置方面,但在普通JS中您需要什么就更清楚了,并且如果有人将普通JS对象视为Java GeoJsonSource(因为它是 一个),则会表现得更加可预测。