gpt4 book ai didi

java - 局部变量必须是 final 或有效的 final

转载 作者:行者123 更新时间:2023-11-29 10:00:12 31 4
gpt4 key购买 nike

我在 Java 8 中有一个异步操作,它返回一个 onError 回调或一个 onSuccess 回调。如果操作成功与否,我需要在我的方法内部返回。所以我返回一个 boolean 值来说明这个信息。我面临的问题是出现以下编译错误:

error: local variables referenced from an inner class must be final or effectively final

谷歌搜索错误我可以看到你不允许这种类型的操作,但是如果操作成功或失败我该如何返回?

 public Boolean addUser(String email, String password) {

Boolean isSuccess = false;

Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("email", new AttributeValue(email)); //email
item.put("password", new AttributeValue(password)); //password

dynamoDB.putItemAsync(new PutItemRequest().withTableName("Users").withItem(item), new AsyncHandler() {
@Override
public void onError(Exception excptn) {

}

@Override
public void onSuccess(AmazonWebServiceRequest rqst, Object result) {
isSuccess = true;
}

});

return isSuccess;

}

最佳答案

首先我会解释错误消息的含义,然后我会告诉您您的设计有什么问题并建议如何处理。

首先是错误信息。 isSuccess 是一个局部变量,也就是说,一旦方法 addUser 完成,它就消失了。但是,您创建的 AsyncHandler 实例的生命周期可能比这更长。如果是这样,它将引用一个不再存在的变量。

如果变量是最终的或实际上是最终的,这将不是问题。然后我们就会知道变量永远不会改变,所以我们可以将变量复制到新创建的对象并引用该副本。请注意,在引用变量的情况下,引用 不会更改,它引用的对象可能仍会被修改。

为了避免这个问题,Java 的创建者决定您不能从匿名内部类(或 lambda 表达式)引用非最终(或实际上最终)的局部变量。错误消息告诉您您正在这样做。

现在开始您的设计。您的设计不能以这种方式工作。 AsyncHandler 实例可能会一直存在到方法完成之后。它的方法可能会在不同的线程中执行,因此它的方法很可能在您的 addUser 方法完成后被调用。那么 addUser 应该返回什么?在它完成的那一刻,它可能连操作是否成功都不知道!

您执行操作异步,即在不同的线程上。这个操作可能需要 1 毫秒,或 1 分钟,甚至 10 年。如果您想查看该操作是否成功,您必须以某种方式将其结果传递给执行 addUser 的线程。

线程间通信不是一项微不足道的任务,但你很幸运:putItemAsync 返回一个 Future 实例,而 Future类正是为您想要做的而设计的:查明异步操作是否已完成并获取其结果。

要检查异步操作是否完成,请轮询返回的FutureisDone() 方法。如果完成,您可以通过调用Futureget() 方法来获取操作的结果。如果操作因抛出异常而异常中止,get() 将抛出 ExecutionException,其 getCause() 是抛出的异常。

或者,当然,您决定使用 putItem 方法同步运行操作(在同一线程上)。然后您的方法将等待操作完成,您会立即得到结果。

关于java - 局部变量必须是 final 或有效的 final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34570747/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com