Java 如何为@JsProperty设置默认值?
我正在为的源对象构建Jsinteropted包装器 我有一个抽象类Java 如何为@JsProperty设置默认值?,java,gwt,gwt-jsinterop,Java,Gwt,Gwt Jsinterop,我正在为的源对象构建Jsinteropted包装器 我有一个抽象类Source,它嵌入了默认方法,比如获取/设置源代码的类型 @JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME) public class Source { @JsProperty protected final native String getType(); @JsProperty protected fina
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文档)定义类型
属性!所以我想做一些类似的事情:
@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class GeoJsonSource extends Source {
@JsConstructor
public GeoJson() {
setType("geojson");
}
}
或
但GWT编译器禁止这两种方法
现在,我使用一个工厂来创建GeoJsonSource,然后放置正确的
类型
属性,但我想知道是否有一种Jsinteropt方法可以做到这一点?如何为其他人的类型设置默认值?你没有
记住,您已经告诉编译器您只是在描述js类对象——如果存在默认值,那么它们已经存在了
考虑一下如何在JS中实现这一点——通常这只是{type:“geojson”}
或var obj={};obj.type=“geojson”
执行以下两个必要步骤:a)创建普通对象,和b)指定默认情况下必须存在的类型
工厂可以工作,也许是GeoJsonSource中的一个静态方法,这样就可以清楚地知道您在做什么
另一个选项是不将GeoJsonSource类型标记为native,也不在全局名称空间中为其指定对象名称(即,不允许您重写其他人的数据),如果这适合您的用例。这将允许您控制类定义的默认值,在构造函数中添加逻辑等等,但是您必须确保正确导出方法 这种方法的局限性包括,从JSON字符串读取的任何对象都不是您的GeoJsonSource类型(但另一方面,这可能无关紧要,因为它可能已经具有
type
属性。但是,它的方法仍然缺少逻辑,因为从JSON读取总是创建普通的对象实例(除非将恢复程序函数传递给JSON.parse()
)
类似地,从JS传递或从JSON.parse()
读取的普通对象也不会正确地传递针对非本地类型的instanceof
检查,这可能要求您在通常编写惯用Java的某些地方使用JS.uncheckedCast
因为您正在构建一个包装器(可能会被其他人使用,他们可能不一定像您一样完全理解这些限制),我倾向于使用工厂方法-是的,它需要在您这方面进行更多的设置,但在纯JS中,您的要求更清晰,如果有人将纯JS对象视为Java GeoJsonSource(因为它是一个),它的行为将更可预测。如何为其他人的类型设置默认值?您没有
记住,您已经告诉编译器您只是在描述js类对象——如果存在默认值,那么它们已经存在了
考虑一下在JS中是如何做到这一点的——通常这只是{type:“geojson”}
或var obj={};obj.type=“geojson”
来完成两个必要的步骤:a)创建一个普通对象,和b)分配一些默认情况下必须存在的类型
工厂可以工作,也许是GeoJsonSource中的一个静态方法,这样就可以清楚地知道您在做什么
另一个选项是不将GeoJsonSource类型标记为native,也不在全局名称空间中为其指定对象名称(即,不允许您重写其他人的数据),如果这适合您的用例。这将允许您控制类定义的默认值,在构造函数中添加逻辑等等,但是您必须确保正确导出方法
这种方法的局限性包括,从JSON字符串读取的任何对象都不是您的GeoJsonSource类型(但另一方面,这可能无关紧要,因为它可能已经具有type
属性。但是,它的方法仍然缺少逻辑,因为从JSON读取总是创建普通的对象实例(除非将恢复程序函数传递给JSON.parse()
)
类似地,从JS传递或从JSON.parse()
读取的普通对象也不会正确地传递针对非本地类型的instanceof
检查,这可能要求您在通常编写惯用Java的某些地方使用JS.uncheckedCast
因为您正在构建一个包装器(可能会被其他人使用,他们可能不一定像您一样完全理解这些限制),我倾向于使用工厂方法-是的,它需要在您这方面进行更多的设置,但在普通JS中,您的要求更加明确,如果有人将普通JS对象视为Java GeoJsonSource(因为它是一个),那么它的行为将更加可预测
@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class GeoJsonSource extends Source {
@JsProperty
private String type = "geojson";
}