2012-10-30 5 views
1

Dites que je veux créer une nouvelle instance foo.Java: création de nouvelles instances

Je vais le faire comme ceci:

SomeClass foo = new SomeClass(); 

Maintenant, supposons que l'objet a atteint sa fin (par exemple, comme une balle entrant en collision dans un jeu.) Et doivent être éliminés et réinitialisée. Pour réinitialiser l'objet que je pouvais le faire soit:

foo = new SomeClass(); 

ou cette

foo.reset(); 

NB: La méthode reset() serait juste réinitialiser toutes les variables de cette instance.

Quelle est la meilleure façon d'aller (en essayant d'éviter GC)? La première option créerait-elle un nouveau pointeur?

Répondre

2

La première option crée un nouvel objet et laisse l'ancien à être collecté en tant que fouillis (sauf s'il existe d'autres références en direct). Une stratégie pour réduire GC est de maintenir un pool d'objets. Ce serait juste une collection d'objets qui n'ont pas d'utilisation actuelle et sont disponibles pour réutilisation. Lorsque vous avez terminé avec un objet, appelez une méthode qui le renvoie au pool. Lorsque vous avez besoin d'un nouvel objet, appelez une méthode qui vérifie le pool avant de créer un nouvel objet; Si le pool n'est pas vide, il supprime un objet du pool et le réutilise plutôt que de créer un nouvel objet.

public class SomeClass { 
    private static final int MAX_POOL_SIZE = . . .; 
    private static final ArrayList<SomeClass> pool = new ArrayList<SomeClass>(); 

    public static SomeClass getInstance() { 
     int poolSize = pool.size(); 
     if (poolSize > 0) { 
      return pool.remove(poolSize-1); 
     } 
     return new SomeClass(); 
    } 

    public void recycle() { 
     // reset any fields 
     if (pool.size() < MAX_POOL_SIZE) { 
      pool.add(this); 
     } 
    } 
    . . . 
} 

Lorsque vous avez besoin d'une nouvelle SomeClass, appelez SomeClass.getInstance(). Lorsque vous avez terminé avec une instance, appelez la méthode recycle().

+0

+1. Pourriez-vous le faire utiliser des génériques à l'instanciation? Et une classe de piscine sepparated? Je ne pense pas que le jeter ensemble est assez propre. – Flavius

+0

@Flavius ​​- C'est un peu plus compliqué, mais cela peut être fait. Vous devez avoir un objet factory ou fournir un autre mécanisme afin qu'une nouvelle instance puisse être construite dans le cas où le pool est vide. –

0

Si vous voulez éviter GC, la deuxième option est meilleure.

En fait, même si vous choisissez la première option, la machine virtuelle Java n'effectuera pas le GC immédiatement. Ca sera GC quand le tas est plein (ou pas assez pour les objets créés). Le premier crée une nouvelle instance et il n'y a pas de référence forte à l'ancien objet. Ainsi, lorsque le tas de JVM est plein, il fera GC, et l'ancien objet GCed. En plus, il y a aussi du contenu sur GC et la référence est le genre de référence que vous avez utilisé. Il y a quatre sortes de réfrences, nommées "Strong, Soft, Weak, et Phantom". Même si vous utilisez la seconde option, l'objet "foo" peut aussi être GCed, à moins que la référence à l'objet "foo" soit une forte réfrence. Voir le document JDK pour en savoir plus sur les quatre types de référence, tels que ReferencePhantomSoftReferenceWeakReference

Questions connexes