gpt4 book ai didi

Java缓存设计问题

转载 作者:行者123 更新时间:2023-12-01 19:19:19 24 4
gpt4 key购买 nike

我需要开发一个简单的缓存(不需要并发或刷新)来保存不同类型的对象。这些对象的查找可能采用不同的方式。假设我们正在缓存具有 ISBN 编号和作者的图书对象。可以通过 ISBN 号查找该对象,例如

Book lookupBookByISBN(String isbn);

或者它可能是像

这样的lookupByAuthor

List lookupBookByAuthor(String authorName);

以一种非常简单的方式,这意味着我可以拥有一个 Cache 对象,它有两个映射,一个用于按 ISBN 存储图书对象,另一个用于按作者姓名存储同一对象。

像这样,想想很多像书这样的对象类型,所以我不想仅仅因为它们的查找不同而将相同的对象存储在不同的映射中。

我正在考虑拥有一个 Map,其键是自定义 Key 对象,值是 Object(这样我就可以存储任何对象或对象列表)Key 对象是一个不可变的对象,可能如下所示

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));
}

插入到 map 中需要小心地完成,因为同一个对象需要插入到 map 中两次。

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);

}

不知怎的,我觉得这可能不是一个好主意,我可能需要将同一个对象放入 map N 次,具体取决于我需要查找对象的 N 个维度。

还有其他方法可以更好地设计相同的东西吗?

最佳答案

当您将对象存储在(任何类型的)集合中时,您仅存储对该对象的引用。因此,继续使用多个贴图,您将只有实际对象的一份副本。

例如

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);

现在可以通过任一 map 访问单个对象mbo

编辑:如果您担心多个 map 的复杂性会使代码变得复杂,请编写一个包含所有 map 的类 MultiMap 并以您想要的方式管理它们。您可以使用方法 add(MyBigObject...) ,它使用各种属性访问器将对象插入到所有映射中以设置正确的键,然后查找诸如 getByAuthor(.. .)getByISBN(...) 以及您需要的任何其他内容。将所有复杂性隐藏在简单的统一界面后面。

关于Java缓存设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com