2011-02-22 99 views
0

我需要开发一个简单的缓存(不需要并发或刷新)来保存不同类型的对象。这些对象的查找可能以不同的方式进行。像让我们说我们正在缓存具有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次。

有没有其他方法可以更好地设计相同的方法?

+0

我会建议为不同的查找类型有不同的地图。这样你就不需要组合键,并且可以使用`Map isbnMap`和`MultiMap authorMap` MultiMap对于一对多的关系是有用的。您的每个查询都只是这些地图上的“get(name)”。 – 2011-02-22 17:27:10

回答

4

将对象存储在任何类型的集合中时,只会将引用存储到该对象。因此,继续使用多个地图,您将只有实际对象的一个​​副本。

例如

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(...)以及其他任何您需要的方法。隐藏简单统一接口背后的所有复杂性。

+0

我知道它存储在多个地图中的同一个参考。我只是担心创建N个地图以不同的方式存储相同的对象。我想知道是否有任何其他方式来设计,以使查找有效,但它作为一个统一的方式存储它。 – Shamik 2011-02-22 17:05:36