2011-02-22 93 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