2012-04-12 2 views
1

Je dois développer quelque chose comme un jeu de la vie. Pour cela, j'ai une classe appelée CellPosition qui a des champs x et y. Afin d'utiliser efficacement la mémoire, je voudrais utiliser une sorte de méthode d'usine.Java méthode de mise en cache

CellPosition.at(int x, int y) qui retournerait une instance de CellPosition. Je voudrais cependant mettre en cache les objets qui ont la même paire x, y. Je pensais à un List ou un HashMap, mais je ne peux pas savoir quoi utiliser comme une clé. Une concaténation de x et y dans une chaîne est sans doute une bonne idée. D'autre part, est-ce une bonne idée de créer simplement un objet à chaque fois et de simplement redéfinir la méthode equals() pour comparer les objets et éliminer toute mise en cache?

Répondre

6

Si vous ne me dérange pas en utilisant Guava, juste:

  1. Faire CellPosition cas immuable, alors
  2. Utilisez un Interner<CellPosition> (obtenu à partir Interners), puis
  3. Passez à la résolution des problèmes réels.

Quelque chose comme ceci:

class CellPosition 
{ 
    private static final Interner<CellPosition> CACHE = Interners.newStrongInterner(); 
    // or .newWeakInterner(), to allow instances to be garbage collected 

    private final int x; 
    private final int y; 

    private CellPosition(int x, int y) 
    { 
     this.x = x; 
     this.y = x; 
    } 

    public int x() { return x; } 
    public int y() { return y; } 

    public static CellPosition at(int x, int y) 
    { 
     return CACHE.intern(new CellPosition(x, y)); 
    } 

    @Override 
    public boolean equals(Object other) {/* TODO */} 

    @Override 
    public int hashCode() {/* TODO */} 
} 

Vous pouvez également utiliser un Goyave Cache au lieu d'un Interner, mais il n'y a pas beaucoup puisque vous auriez à construire une clé int paire pour le cache - que vous faites de toute façon pour l'interner, en moins de LoC.

+0

Merci, ce serait mon secours si je ne trouve pas de solution de vanille. – FreeCandies

+2

Vous pouvez faire exactement la même chose avec Java vanilla, mais je ne vois pas de raison impérieuse de réinventer la roue ici. En plus, Guava est une bibliothèque fantastique - une fois que vous commencez à l'utiliser, vous allez adorer. –

+0

+1 très cool! La goyave a l'air vraiment incroyable! –

0

Je pense que la mise en cache de ces objets n'est pas nécessaire, surtout s'ils sont très petits, comme vous semblez l'indiquer. Ce que vous pouvez faire au premier abord est exactement ce que vous avez décrit, avoir CellPosition comme objet de valeur , qui est immuable; et implémenter correctement equals et hashCode.

0

Vous pouvez utiliser l'annotation AOP et @Cacheable de jcabi-aspects:

class CellPosition { 
    @Cacheable(forever = true) 
    public static CellPosition at(int x, int y) { 
    // instantiate and return 
    } 
}