引用内部类中的非最终变量数据

我在GWT做一个程序。 这是我遇到问题的片段

private String[] populateRSSData() { 1==>> String[] data = null; try { new RequestBuilder(RequestBuilder.GET, "../database.php?action=populaterss").sendRequest(null, new RequestCallback() { @Override public void onResponseReceived(Request request, Response response) { 2==>> data=response.getText().split("~"); } @Override public void onError(Request request, Throwable exception) { Window.alert(exception.getMessage()); } }); } catch (RequestException e) { Window.alert(e.getMessage()); } return data; } 

现在问题出现了,我得到一个错误,即变量1==>> data应该被声明为final 。 但如果我将其声明为final那么我无法将数据存储在2==>>

我得到的错误

Cannot refer to a non-final variable data inside an inner class defined in a different method RSS_Manager.java

请建议

即使您设法克服错误,该function也不会按照您的意图执行。 您正在创建的回调将以异步方式通知从服务器收到的响应,而您的方法populateRSSData()将立即返回。

考虑到异步,您需要重新考虑您的设计。

编辑:请参阅习惯异步调用

编辑:从上面的链接引用

要理解的重要问题是,在执行到服务器的实际往返过程中,将执行RPC调用调用之后的代码。 尽管onSuccess()方法中的代码是与调用内联定义的,但是在调用代码返回到JavaScript主循环并且来自服务器的结果消息返回之前,它不会被执行。

一个简单的方法 – 将data声明为字符串列表并使列表最终。 您始终可以将元素添加到最终列表中(您只能为最终变量分配不同的列表)。

所以对于你的代码:

 private String[] populateRSSData() { final List data = new ArrayList(); try { new RequestBuilder(RequestBuilder.GET, "../database.php?action=populaterss").sendRequest(null, new RequestCallback() { @Override public void onResponseReceived(Request request, Response response) { data.addAll(Arrays.asList(response.getText().split("~")); } @Override public void onError(Request request, Throwable exception) { Window.alert(exception.getMessage()); } }); } catch (RequestException e) { Window.alert(e.getMessage()); } return data.toArray(new String[data.size()]); } 

您需要为可变的数据使用不同的数据结构 – 您可以修改final变量,但不能分配给它。 也许java.util.Vector或类似的东西在这里适合您的需求。

您应该将数据变量设置为类成员(如果可能),或者将其包装为声明为final的对象。

必须将本地内部类中使用的变量声明为final。 另请参见: 方法本地内部类访问方法的局部变量 。

– 编辑 –

塔希尔·阿赫塔尔指出了一些非常重要的事情。 除了我提到的一般要点之外,你的设计还有一个缺陷 – 回调用于异步响应。 响应可能在方法终止后很长时间到达,因此结果将不会被分配。