GWT 2.7:从JSNI最佳实践中获得长期回报

时间:2014-12-11 15:47:58

标签: java javascript html gwt

使用GWT 2.7我在JavaScript中存储和检索长值,如下面的代码所示:

private final native void setTime(Long time) /*-{
  return this.myLong;
}-*/;

private final native Long getTime() /*-{
  return this.myLong;
}-*/;

private void start() {
  Date date = new Date();
  long time = date.getTime();
  setTime(time);

  long time2 = getTime();
}

注意:我始终可以确保JavaScript部分中的长值不会更改,因为这些值只是在JavaScript中以数据库形式存储和检索。

这是将长值放入JavaScript还是从JavaScript中放入值的最佳方法?使用double值然后转换为long会更好吗?

2 个答案:

答案 0 :(得分:3)

如果您只是阅读该物业,那么这将适合您。

@UnsafeNativeLong
public final native long getValuePropertyLong(String key) /*-{
    return this.value[key];
}-*/;

在这里您可以找到更多信息 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

  

Java long类型无法在JavaScript中表示为数字   类型,因此GWT使用不透明的数据结构模拟它。这意味着   JSNI方法不能处理长数字类型。该   因此,编译器默认情况下不允许直接访问long   来自JSNI:JSNI方法不能长期作为参数类型或   返回类型,并且他们无法使用JSNI引用访问long。如果   你发现自己想要传入或传出一个JSNI方法,   这里有一些选择:       对于适合double类型的数字,请使用double类型而不是long类型。       对于需要完整长语义的计算,重新排列代码,以便计算发生在Java而不是   JavaScript的。这样他们就会使用长期仿真。       对于要通过未更改的值传递给Java代码的值,请将值包装在Long中。 JSNI对Long类型没有限制   方法。       如果您确定知道自己在做什么,可以将com.google.gwt.core.client.UnsafeNativeLong注释添加到方法中。   然后编译器将允许您传入和传出一个长的   JavaScript的。但它仍然是一种不透明的数据类型,所以它是唯一的   你可以用它做的事情就是将它传递给Java。

答案 1 :(得分:3)

为了补充Chri的答案,JavaScript实际上无法追踪long的全部价值!它可以跟踪的最精确数字相当于Java double(64位IEEE 754浮点数),并且有一些合法值,当转换为double并再次返回时,不再是相同的数字!

如果您只是阅读属性,那么如果您有足够的精确度来实际存储它,那么不安全的长注释将起作用。如果你愿意,可以使用double,或者如果你想要一个db ID,或者当你通过JS看到它时有什么不改变你的话,请使用String ...