我需要构建一个自定义类对象的缓存(如财务中的安全性)。可以通过多种方式识别类的对象,因为它具有多个标识符,如PKey,Name,Long Name或不同语言的任何其他类型的名称。
因此,缓存应该可以根据任何标识符(即多个密钥)进行搜索。
如何创建这样的缓存?
我正在使用C#4.5,但我认为这是一个普遍的问题,所以解决方案可以提供任何帮助
我认为快速有效的解决方案之一是为不同的标识符保留不同的缓存。对于例如<名称,Pkey>,<长名称,Pkey>,<标识符,PKEY>以及具有<类型的对象的单个缓存p键,对象>
有更新更好的方法吗?
编辑:当我访问缓存时,所有密钥都是未知的,所以我 无法制作复合键
答案 0 :(得分:0)
也许这段代码会很有用:
public class Test12 {
static Map<CacheKey, SecureObject> cache = new ConcurrentHashMap<CacheKey, SecureObject>();
public static void main(String[] args) {
SecureObject secureObject = new SecureObject(new CacheKey("pkey1", "name1", 1L));
cache.put(secureObject.getKey(), secureObject);
secureObject = new SecureObject(new CacheKey("pkey1", "name2", 2L));
if (cache.containsKey(secureObject.getKey())) {
System.out.println("Already in cache.");
}
}
}
class CacheKey {
String pkey;
String name;
Long longName;
CacheKey(String pkey, String name, Long longName) {
this.pkey = pkey;
this.name = name;
this.longName = longName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CacheKey cacheKey = (CacheKey) o;
if (pkey != null && pkey.equals(cacheKey.pkey)) {
return true;
} else {
if (name != null && name.equals(cacheKey.name)) {
return true;
} else {
if (longName != null && longName.equals(cacheKey.longName)) {
return true;
} else {
return false;
}
}
}
}
@Override
public int hashCode() {
int result = 0;
if (pkey != null) {
result = pkey.hashCode();
} else if (name != null) {
result = name.hashCode();
} else if (longName != null) {
result = longName.hashCode();
}
return result;
}
}
class SecureObject {
CacheKey key;
SecureObject(CacheKey key) {
this.key = key;
}
public CacheKey getKey() {
return key;
}
public void setKey(CacheKey key) {
this.key = key;
}
}
打印:
已经在缓存中。
这不是完整的解决方案。这只是方向。