如何设置@JsProperty的默认值?

问题描述 投票:0回答:1

我正在为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方法可以做到这一点?

java gwt gwt-jsinterop
1个回答
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()读取的普通Object将无法正确传递针对非本机类型的instanceof检查,这可能需要您在通常编写惯用Java的某些地方使用Js.uncheckedCast


由于您正在构建一个包装器(可能被其他人使用,可能不一定完全像您一样理解这些限制),我倾向于赞成工厂方法 - 是的,它需要更多设置在您身边,但是如果有人将普通的JS对象视为Java GeoJsonSource(因为它是一个),那么在普通的JS中你更清楚你要求的东西,并且表现得更可预测。

© www.soinside.com 2019 - 2024. All rights reserved.