有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java,对象池:将对象返回池后使其不可用?

我正在编写一个SshConnectionPool,它存储并返回SshConnections。我们的想法是,用户应该这样做:

^{pr 1}$

然后我希望sc引用不可用。我知道在release()方法的实现中不能将其设置为null。但我该怎么做呢


共 (3) 个答案

  1. # 1 楼答案

    不知道如何“重用”SshConnection对象,但无论如何,我的建议是:

    • 向其构造函数中添加一个参数,即SshPool本身
    • 使SshConnection对象实现Closeable,在.close()中,将对象返回到池中

    例如:

    private final SshPool pool;
    
    SshConnection(final SshPool pool, other parameters)
    {
        this.pool = pool;
        // etc
    }
    
    @Override
    public void close()
        throws IOException
    {
        pool.release(this);
        // other instructions here
    }
    

    这意味着您可以在try with resources语句中使用这些对象;对API用户的唯一要求是,一旦使用了.close(),他们就应该对任何Closeable对象这样做

  2. # 2 楼答案

    如果我理解正确的话。。然后你需要使这个类不可变

    这样,对象实例将可由变量使用,但对于任何更改,对象将被丢弃,并创建一个新实例

    how to make immutable

  3. # 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放入包装器中。这样,您仍然可以访问有关会话的信息(例如主机、用户等),但不能对其调用任何方法

    我知道有些代码不会出错,但我希望描述足够清楚