我需要开发一个简单的缓存(不需要并发或刷新)来保存不同类型的对象。这些对象的查找方式可能不同。就像让我们说我们是缓存图书对象,它有ISBN编号和作者。此对象的查找可以使用ISBN编号,例如
Book lookupBookByISBN(String isbn);
或者可能是一个lookupByAuthor
List lookupBookByAuthor(String authorName);
简单地说,这意味着我可以有一个Cache对象,它有两个映射--一个用于存储ISBN的图书对象,另一个用于通过authorname存储相同的对象。
就像这样,想一想很多这样的对象类型,比如book,所以我不想仅仅因为它们的查找不同而将相同的对象存储在不同的地图中。
有一种方法是让一个Map的键是自定义的键对象,值是object (这样我就可以存储任何对象或对象列表)键对象是一个不可变的对象,它看起来可能如下所示
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个维度。
还有其他更好的设计方法吗?
发布于 2011-02-22 16:59:41
当您将对象存储在集合(任何类型)中时,您只存储对对象的引用。因此,继续使用多个映射,您将只有一个实际对象的副本。
例如
Map<String,MyBigObject> map1 = new HashMap...
Map<String,MyBigObject> map2 = new HashMap...
MyBigObject mbo = new MyBigObject(...);
map1.put(mbo.getISBN(),mbo);
map2.put(mbo.getAuthor(),mbo);现在可以通过任何一个映射访问单个对象mbo。
编辑:如果您担心代码复杂的多个映射的复杂性,那么编写一个包含所有映射的类MultiMap,并以任何您想要的方式管理它们。您可以使用add(MyBigObject...)方法将对象插入到所有映射中,使用各种属性访问器设置正确的键,然后查找方法(如getByAuthor(...)和getByISBN(...) )以及所需的任何其他方法。将所有的复杂性隐藏在一个简单的、统一的交织中。
https://stackoverflow.com/questions/5081218
复制相似问题