我需要开发一个简单的缓存(不需要并发或刷新)来保存不同类型的对象。这些对象的查找可能以不同的方式进行。像让我们说我们正在缓存具有ISBN号和作者的书对象。此对象的查找可以是ISBN编号,如Java缓存设计问题
Book lookupBookByISBN(String isbn);
,也可能是像
列表lookupBookByAuthor(字符串AUTHORNAME)一lookupByAuthor;
以一种非常简单的方式,这意味着我可以拥有一个Cache对象,它具有两个地图,一个通过ISBN存储书对象,另一个通过作者名存储相同的对象。像这样,想象很多像书本这样的对象类型,所以我不想在不同的地图中存储相同的对象,只是因为它们的查找是不同的。
有一种方法,我想有一个单一的地图,其关键是一个自定义的关键对象和值是对象(这样我可以存储任何对象或对象列表) 关键对象是一个不可变的对象,它可能看起来像此
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次。
有没有其他方法可以更好地设计相同的方法?
我会建议为不同的查找类型有不同的地图。这样你就不需要组合键,并且可以使用`Map isbnMap`和`MultiMap authorMap` MultiMap对于一对多的关系是有用的。您的每个查询都只是这些地图上的“get(name)”。 –
2011-02-22 17:27:10