2010-04-23 2 views
4

Je me demandais si quelqu'un pourrait expliquer comment le code suivant fonctionne:Retour d'une classe anonyme utilisant une primitive finale. Comment ça marche?

public interface Result { 
    public int getCount(); 
    public List<Thing> getThings(); 
} 


class SomeClass { 
... 
    public Result getThingResult() { 
    final List<Thing> things = .. populated from something. 

    final int count = 5; 

    return new Result { 
     @Override 
     public int getCount() { 
     return count; 
     } 

     @Override 
     public List<Thing> getThings(); 
     return things; 
     } 
    } 
    } 
... 
} 

D'où proviennent les int primitive, liste de référence et une liste d'instances sont stockés dans la mémoire? Il ne peut pas être sur la pile .. alors où? Y a-t-il une différence entre la façon dont les références et les primitives sont traitées dans cette situation?

Merci un bouquet, Tim P.

+1

Souhaitez-vous expliquer la langue, le système d'exploitation et la mise en œuvre concernés? Ensuite, vous pouvez mettre l'information dans les balises, ou je pourrais. En ce moment, vous posez une question précise sans la limiter aux personnes qui sauront la réponse. –

+0

@JRL, cela n'explique pas comment il est implémenté en Java. – finnw

+0

Désolé, premier message sur stackoverflow. –

Répondre

4

Les habitants finaux utilisés (et les références externes this) sont copiés dans les champs de synthèse de la classe interne pendant la construction. Les références et les primitives sont, comme toujours, traitées de la même manière. Les deux sont copiés (peu profonds).

Vous pouvez utiliser javap à partir du JDK pour voir ce qui est généré.

+1

... c'est pourquoi ils doivent être définitifs: pour que personne ne puisse dire que les variables sont simplement copiées. –

+0

@Michael Il serait, bien sûr, possible de faire discrètement des allocations supplémentaires pour stocker l'état mutable sur le tas. –

+0

@Michael: Vous pouvez vous frayer un chemin au-delà de la finalité en utilisant des tableaux (ou tout autre conteneur, un 'Holder' fonctionnerait assez bien). Sale, mais fonctionne. –