Java 将对象添加到KeyedObjectPool<;K、 V>;在apachecommons池中

Java 将对象添加到KeyedObjectPool<;K、 V>;在apachecommons池中,java,apache-commons,Java,Apache Commons,关于这个在线的文档很少。有人知道如何向这个KeyedPool添加新的K,V吗。addObject有一个实体,但它是如何引用k,v的 对问题的修改: [我发现的一个例子] 假设我想要实现一个键控连接池,其中每个键都引用一个连接: 例如:KeyObjectPool项 那么,我的问题是,我该如何添加新的连接? 是否有类似item.add(key,value)的内容?在这种情况下,K和V是通用的。 这意味着它们可以是任何东西 你会告诉我,是的,但我怎么知道K或V是 简单!您必须告诉类字段应该是什么类型

关于这个在线的文档很少。有人知道如何向这个KeyedPool添加新的K,V吗。addObject有一个实体,但它是如何引用k,v的

对问题的修改: [我发现的一个例子]

假设我想要实现一个键控连接池,其中每个键都引用一个连接:

例如:KeyObjectPool项

那么,我的问题是,我该如何添加新的连接?
是否有类似item.add(key,value)的内容?

在这种情况下,K和V是通用的。
这意味着它们可以是任何东西

你会告诉我,是的,但我怎么知道K或V是 简单!您必须告诉类字段应该是什么类型

比如说

KeyedObjectPool<String,String> kop = new KeyedObjectPool<String,String>();
如果您尝试以下方法,将起作用:

kop.addObject("hello");
kop.addObject(new POJO());
将失败

很简单

(p.s.POJO是一个普通的旧java对象,例如您创建的任何类)

答案是您不能,因为您不应该这样做。KeyedObjectPool的思想是,该池将使用工厂为您生成对象(值)

对于示例实现,请查看GenericKeyedObjectPool:

特别令人感兴趣的是从

编辑:应该注意,setFactory()方法已被弃用,因此您希望避免使用它

我认为您面临的基本问题是KeyedObjectPool设计用于为您确定对象创建(或值),但希望专门定义您自己的对象(在本例中为连接配置)并将其作为值分配给键

我认为您真正想要使用的是一个映射,但可能您无法控制它,并且正在使用一个围绕KeyedObject池构建的框架。如果是这样的话,那么在你试图做的事情中,你将面临更深层次的基本架构设计缺陷


在不了解更多您正在尝试的总体情况的情况下,我只能建议您重新考虑您的设计。

将KeyedPoolableObjectFactory传递给构造函数中的GenericKeyedObjectPool。KeyedPoolableObjectFactory有一个方法

public Object makeObject(Object key) throws Exception {

在其中,您根据键为池构造一个新值。

什么?我不知道你在问什么。你能试着重新表述这个问题吗,或者举个例子说明你想做什么?我已经更新了这个问题,请检查我是否同意这个问题。但是,您的示例中的“Hello”与它的值有何关联?假设我想添加到这个keyedobject池kop.addObject(“hello”),但是值是如何链接到它的?这取决于您使用的工厂类型,创建obj是工厂的职责,当您将密钥传递到池时,它会向工厂请求obj。工厂创建对象并将其返回到池中。或者是一本有趣而重要的读物。我不是obj池的向导。我认为,如果你想实现这样一个东西,你必须把你的想法弄清楚。这是否意味着每当我们执行addObject时,都会从Factory中创建一个新实例并将其放入池中?如果我们希望不同的密钥具有不同的连接配置,我们将如何工作?这取决于KeyedObjectPool的实现,通常是的。至于如何使不同的键具有不同的连接配置,除非您能够控制KeyedObjectPool的实现,或者可能控制KeyedPoolableObjectFactory的实现,否则您无法控制这些连接配置。我现在想知道为什么要使用KeyedObjectPool而不仅仅是HashMap。我将编辑我的答案以提供更多的想法。但是设计文档中说“一个键控池汇集了多种类型的实例。每种类型都可以使用任意键进行访问。”那么这里的多种类型是什么意思呢?我遗漏了什么吗?我不确定他们所说的“类型”是什么意思,不幸的是,他们的Javadoc在这一点上含糊不清,似乎不一致。我认为,如果说有什么问题的话,那就是javadocs遗漏了什么。