2011-08-29 1 views
2

Voici mon code:Comment les paramètres de méthode de classe anonyme peuvent-ils être renvoyés à la classe d'instanciation d'origine?

public void pollLocation() 
{ 
    myLocation.getLocation(this, new LocationResult() 
    { 
     public void gotLocation(Location location) 
     { 
      //I want to assign Location object from here... 
     } 
    }); 
} 

private Location lastLocation; //...to here. 

Est-ce possible?

+6

'lastLocation = quelque chose 'ne fonctionne pas? – Thilo

+0

Mes compétences de débogage psychique me disent que 'gotLocation' est un rappel asynchrone, mais que vous attendez qu'il s'exécute de manière synchrone. – SLaks

+1

@Bruno: Incorrect. Les classes internes peuvent écrire dans tous les champs (par opposition aux locaux). Ils obtiennent une référence à 'this 'du parent. – SLaks

Répondre

2

Oui. En général, vous pouvez simplement écrire

lastLocation = location 

Mais peut-être la classe LocationResult/interface a également un champ nommé lastLocation. Dans ce cas, vous devez écrire

OuterClassName.this.lastLocation = location 

Mais comme il semble que vous feriez des sondages asynchrones, il est trop dangereux de le faire sans synchronisation. De même, vous ne remarquerez pas quand lastLocation est défini. Il est donc préférable d'utiliser un setter synchronisé dans la classe externe.

+0

Notez que l'utilisation d'un setter synchronisé garantit uniquement la sécurité des threads si chaque lecture de la variable (même à l'intérieur de l'instance) s'effectue via un getter synchronisé (qui acquiert le même verrou que le setter - ce qui est le cas pour ' Syntaxe void setX (x) {...} '/' synchronisé X getX() {...} '). –

+0

Oui, je n'ai pas compris que la classe anonyme était dans la portée de sa classe d'instanciation. Je vais aussi utiliser les getters et setters synchronisés. – Teddy

1

Vous pouvez utiliser un setter:

public void pollLocation() 
{ 
    myLocation.getLocation(this, new LocationResult() 
    { 
     public void gotLocation(Location location) 
     { 
      //I want to assign Location object from here... 
      setLastLocation(...); 
     } 
    }); 
} 

private Location lastLocation; //...to here. 
private void setLastLocation(Location l) { lastLocation = l; } 

Faites juste attention sur les questions multithreading. Si vous utilisez plusieurs threads, vous devriez déclarer lastLocation volatile ou utiliser un AtomicReference. Sinon, votre code pourrait ne pas fonctionner comme prévu.

Questions connexes