java,对象池:将对象返回池后使其不可用?
我正在编写一个SshConnectionPool,它存储并返回SshConnections。我们的想法是,用户应该这样做:
^{pr 1}$
然后我希望sc
引用不可用。我知道在release()
方法的实现中不能将其设置为null。但我该怎么做呢
你可以在下面搜索框中键入要查询的问题!
我正在编写一个SshConnectionPool,它存储并返回SshConnections。我们的想法是,用户应该这样做:
^{pr 1}$
然后我希望sc
引用不可用。我知道在release()
方法的实现中不能将其设置为null。但我该怎么做呢
# 1 楼答案
不知道如何“重用”
SshConnection
对象,但无论如何,我的建议是:SshPool
本身李>SshConnection
对象实现Closeable
,在.close()
中,将对象返回到池中李>例如:
这意味着您可以在try with resources语句中使用这些对象;对API用户的唯一要求是,一旦使用了
.close()
,他们就应该对任何Closeable
对象这样做# 2 楼答案
如果我理解正确的话。。然后你需要使这个类不可变
这样,对象实例将可由变量使用,但对于任何更改,对象将被丢弃,并创建一个新实例
how to make immutable
# 3 楼答案
为了那些有朝一日会追随我脚步的勇士:
我最终做的是:我将
SshSession
声明为一个接口,并创建了它的3个实现:一个具有所有功能的实/实/工作会话(RealSession
),变量设置为实值,方法执行实际工作(例如exec(String command)
将在远程机器上执行命令),一个具有所有IVAR的虚拟会话(DummySession
),但是在调用“do”方法时抛出异常(例如,它在ssh.hostname()
上返回真实的主机名,但在ssh.exec(command)
上抛出异常,并且会话包装器中包含SshSession
实现,并且会话包装器中的所有方法在包装的会话上调用相应的方法SshPool
在其中存储一个RealSession
的映射,但返回一个SessionWrapper
,其中包含一个RealSession
。因此,在池之外,您只能处理SessionWrapper
。因此,当您调用pool.release(sessionwrapper)
时,池将会话从包装器返回到池中,并将DummySession
放入包装器中。这样,您仍然可以访问有关会话的信息(例如主机、用户等),但不能对其调用任何方法我知道有些代码不会出错,但我希望描述足够清楚