2012-04-12 102 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 
    } 
}