I've got some code which defines an anonymous inner class for a callback handler. This handler needs to assign a local variable, see below. I need to assign resp
in the callback and refer to it towards the end of the function. I am getting this error in Eclipse however:
The final local variable resp
cannot be assigned, since it is defined in an enclosing type
How can I fix this?
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());
}
}
Here is a hack that would work in your case:
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());
}
}
If you want a cleaner solution, though, you have to define a named class for your handler, store the response in its field, and retrieve it using an accessor method.
Best regards, Stan.
You could get around this by creating a wrapper class for the response.
class ResponseWrapper {
UnlockDoorResponse resp;
void setResponse(UnlockDoorResponse resp) {
this.resp = resp;
}
UnlockDoorResponse getResponse() {
return resp;
}
}
Then, your code would look like:
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());
}
Assuming this is your code to change, how about changing sendRequest
and ResponseAction.execute
to return an instance of UnlockDoorResponse
DoorResult unlockDoor(final LockableDoor door) {
final UnlockDoorResponse resp = sendRequest(new UnlockDoorRequest(door), new ResponseAction() {
public UnlockDoorResponse execute(Session session) throws TimedOutException, RetryException, RecoverException {
session.watch(UNLOCK_DOOR);
return (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
}
});
if (resp == null) {
return DoorResult.COMMS_ERROR;
}
else {
return DoorResult.valueOf(resp.getResponseCode());
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With