【发布时间】:2012-01-04 15:57:36
【问题描述】:
我有一个点对象:
class Point {
final int x,y;
...
}
因为这些点将在我的代码中到处使用/创建,所以我想开始使用番石榴缓存。不幸的是,CacheLoader 只接受一个参数。 Another question 在 stackoverflow 上使用 pair 对象来解决类似的问题。但我不喜欢为每个缓存请求创建一个虚拟对象的想法。 所以我想出了自己的解决方法:
因为对象是由 x 和 y 指定的,我想我可以将两个值合并(移位)成一个 long,这将是我的关键。
void test(int x, int y) {
Long key = (long) ((long) (x) << Integer.SIZE | y);
Point point = cache.get(key);
}
CacheLoader<Long, Point> loader = new CacheLoader<Long, Point>() {
public Point load(Long key) throws Exception {
final int x,y;
// shift magic
x = (int) (key >> Integer.SIZE);
y = key.intValue();
return new Point(x, y);
}
};
我其实是个新手。这行得通吗?我错过了什么?这比对类“更快”吗?这是我的问题!
是的,我测试了代码,到目前为止我可以判断它是否有效。
【问题讨论】:
-
哎呀。 请为该点创建一个真实对象(带有两个命名良好的字段)!您已经在创建一个“虚拟”对象,一个 java.lang.Long,只是更加模糊。