Accéder aux variables de la classe interne
J'ai un bout de code qui définit un anonyme intérieur de la classe pour un gestionnaire de rappel. Ce gestionnaire doit affecter une variable locale, voir ci-dessous. J'ai besoin d'attribuer resp
dans le rappel et les référer vers la fin de la fonction. J'obtiens cette erreur dans Eclipse cependant:
La dernière variable locale resp
ne peut pas être affectée, car elle est définie dans un enfermant type
Comment puis-je résoudre ce problème?
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());
}
}
source d'informationauteur fred basset
Vous devez vous connecter pour publier un commentaire.
Voici un hack qui fonctionne dans votre cas:
Si vous voulez une solution plus propre, cependant, que vous devez définir une classe nommée pour votre gestionnaire de magasin de la réponse dans son domaine, et de le récupérer à l'aide d'une méthode d'accesseur.
Meilleures salutations,
Stan.
Vous pourriez contourner ce problème en créant une classe wrapper pour la réponse.
Ensuite, votre code devrait ressembler à:
En supposant que c'est votre code à changer, comment sur la modification de
sendRequest
etResponseAction.execute
de retourner une instance deUnlockDoorResponse
Si vous vous apprêtez à retourner des résultats, puis d'utiliser un nommé intérieure de la classe au lieu d'un anonyme. Toutes les autres options qui vous sont présentés sont à mon humble avis laid hacks (soi-même admis 😉
(OK, @Joel n'est pas, mais suppose que vous pouvez changer l'interface vous êtes à la mise en œuvre)
Il suffit de créer une instance de la classe avec un getter pour le résultat, il est propre et ne nécessite l'implémentation de la classe unique.