fre*_*set 10 java anonymous-inner-class inner-classes
我有一些代码为回调处理程序定义了一个匿名内部类.这个处理程序需要分配一个局部变量,见下文.我需要resp
在回调中分配并在函数结束时引用它.我在Eclipse中遇到此错误:
resp
无法分配最终的局部变量,因为它是在封闭类型中定义的
我怎样才能解决这个问题?
DoorResult unlockDoor(final LockableDoor door) {
final UnlockDoorResponse resp;
final boolean sent = sendRequest(new UnlockDoorRequest(door),
new ResponseAction() {
public void execute(Session session)
throws TimedOutException, RetryException, RecoverException {
session.watch(UNLOCK_DOOR);
resp = (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
}
});
DoorResult result;
if (!sent) {
return DoorResult.COMMS_ERROR;
}
else {
return DoorResult.valueOf(resp.getResponseCode());
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是一个适用于您的案例的黑客:
DoorResult unlockDoor(final LockableDoor door) {
final UnlockDoorResponse resp[] = { null };
final boolean sent = sendRequest(new UnlockDoorRequest(door), new ResponseAction() {
public void execute(Session session) throws TimedOutException, RetryException, RecoverException {
session.watch(UNLOCK_DOOR);
resp[0] = (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
}
});
DoorResult result;
if (!sent) {
return DoorResult.COMMS_ERROR;
}
else {
return null == resp[0] ? null : DoorResult.valueOf(resp[0].getResponseCode());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果需要更清晰的解决方案,则必须为处理程序定义命名类,将响应存储在其字段中,并使用访问器方法检索它.
最好的问候,斯坦.
您可以通过为响应创建一个包装类来解决这个问题。
class ResponseWrapper {
UnlockDoorResponse resp;
void setResponse(UnlockDoorResponse resp) {
this.resp = resp;
}
UnlockDoorResponse getResponse() {
return resp;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您的代码将如下所示:
final ResponseWrapper respWrap = new ResponseWrapper();
final boolean sent = sendRequest(new UnlockDoorRequest(door), new ResponseAction() {
public void execute(Session session) throws TimedOutException, RetryException, RecoverException {
session.watch(UNLOCK_DOOR);
respWrap.setResponse((UnlockDoorResponse)session.watch(UNLOCK_DOOR));
}
});
DoorResult result;
if (!sent) {
return DoorResult.COMMS_ERROR;
}
else {
return DoorResult.valueOf(respWrap.getResponse().getResponseCode());
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14014 次 |
最近记录: |