我需要開發一個簡單的緩存(不需要併發或刷新)來保存不同類型的對象。這些對象的查找可能以不同的方式進行。像讓我們說我們正在緩存具有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