2012-04-12 100 views
1

我必須開發一些類似於生命的遊戲。爲此,我有一個名爲CellPosition的課程,其中有xy字段。爲了有效地使用內存,我想使用某種工廠方法。Java工廠方法緩存

CellPosition.at(int x, int y)這將返回一個CellPosition的實例。我希望緩存具有相同x, y對的對象。我雖然是ListHashMap,但我無法弄清楚什麼是鑰匙。字符串中的xy的連接是一個好主意。

另一方面,每次只創建一個對象並重新定義equals()方法來比較對象並丟棄任何緩存是個好主意?

回答

6

如果你不介意使用Guava,只是:

  1. CellPosition情況不變,那麼
  2. 使用到解決實際問題的Interner<CellPosition>(從Interners獲得),然後
  3. 移動。

事情是這樣的:

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 */} 
} 

你也可以使用一個番石榴Cache代替Interner的,但有沒有多大意義,因爲你必須構建緩存的int-對關鍵 - 無論如何你都是爲了內行者而做的,只需要更少的LoC。

+0

謝謝,那將是我的備用,如果我沒有找到任何香草液。 – FreeCandies 2012-04-12 21:11:39

+2

你可以用vanilla做同樣的事情,但我沒有看到一個令人信服的理由在這裏重新發明輪子。除了番石榴是一個夢幻般的圖書館 - 一旦你開始使用它,你會愛上它。 – 2012-04-12 21:25:23

+0

+1非常酷!番石榴看起來非常神奇! – 2012-04-12 23:00:20

0

我認爲緩存這些對象並不是必需的,特別是如果它們非常小,就像您似乎暗示的那樣。你首先要做的就是你所描述的,將CellPosition作爲值對象,這是不可變的;並妥善實施equalshashCode

0

您可以使用AOP和@Cacheable註釋從jcabi-aspects

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