缓存Java缓存设计问题
我需要开发一个简单的缓存(无需并发或刷新)来保存不同类型的对象。这些对象的查找方式可能不同。比如说,我们正在缓存具有ISBN编号和作者的book对象。此对象的查找可以按ISBN编号进行,如
Book lookupBookByISBN(String isbn);
或者它可能是一个像
List lookupBookByAuthor(String authorName);
以一种非常简单的方式,这意味着我可以有一个缓存对象,它有两个映射,一个是通过ISBN存储book对象,另一个是通过authorname存储同一对象
像这样,想想很多像book这样的对象类型,所以我不想仅仅因为它们的查找不同而将同一个对象存储在不同的映射中
一种方法是,我考虑使用一个单独的映射,其键是一个自定义键对象,值是object(这样我就可以存储任何对象或对象列表) Key对象是一个不可变的对象,看起来可能是这样的
public class Key {
private final Stirng keyName;
private final String keyValue;
public Key(String name,String value) {
this.keyName= name;
this.keyValue = value;
}
//getters for keyName and value
//hashcode and equals to be put as a key of a map
}
将讨论查找方法的实现
public Book lookupBookByISBN(String isbn) {
Key key = new Key("ISBN",isbn);
return ((Book)map.get(key));
}
public List<Book> lookupBookByAuthor(String isbn) {
Key key = new Key("Author",isbn);
return (List<Book>map.get(key));
}
插入地图时需要小心,因为同一个对象需要插入地图两次
public void putBook(Book book) {
Key key = new Key("ISBN",book.getISBN());
map.put(key,book);
key = new Key("Author",book.getAuthor());
List<Book> list = map.get(key);
if (null == list) {
list = new ArrayList<Book>();
map.put(key,book);
}
list.add(book);
}
不知何故,我觉得这可能不是一个好主意,我可能需要在地图中放置相同的对象N次,这取决于我需要查找对象的N个维度
有没有其他更好的设计方法
# 1 楼答案
在集合(任何类型)中存储对象时,只存储对该对象的引用。所以继续使用多个贴图,你将只有一个实际对象的副本
比如
单个对象
mbo
现在可以通过任一映射访问编辑:如果您担心多个映射的复杂性会使代码复杂化,请编写一个类
MultiMap
,该类包含所有映射,并以任何方式管理它们。您可以使用方法add(MyBigObject...)
将对象插入所有映射,使用各种属性访问器设置正确的键,然后使用getByAuthor(...)
和getByISBN(...)
等查找方法,以及您需要的任何其他方法。将所有的复杂性隐藏在一个简单的统一的互动背后