java,对象池:将对象返回池后使对象无法使用?

时间:2014-05-07 08:33:14

标签: java pool

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

SshConnection sc = SshPool.getInstance().getConnection(server, user, password, port);
// use connection in some way
SshPool.getInstance().release(sc);

之后我希望sc引用无法使用。我知道在release()方法的实现中我无法将其设置为null。但是我该怎么做呢?

3 个答案:

答案 0 :(得分:2)

不知道你将如何“重用”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对象做任何事情。

答案 1 :(得分:0)

如果我理解这个问题是正确的......那么你需要让这个课成为不可变的

表示对象实例可以被变量使用,但是对于任何更改,对象将被丢弃并且将创建一个新实例

how to make immutable

答案 2 :(得分:0)

对于那些将来会跟随我的脚步的勇者:

我最终做的是:我将SshSession声明为接口,并创建了3个实现:真实/实时/工作会话(RealSession),它具有所有功能,变量设置实际值和方法做实际工作(例如exec(String command)将在远程机器上执行命令),虚拟会话(DummySession)具有所有ivars,但在"做&时会抛出异常#34;调用方法(例如,它在ssh.hostname()上返回实际主机名,但在ssh.exec(command)上抛出异常,并在其中具有SshSession实现的会话包装器以及其中的所有方法session wrapper调用包装会话上的相应方法。

SshPool会在其中存储RealSession s的地图,但会返回SessionWrapper并包含RealSession。因此,在池外,您只能处理SessionWrapper s。因此,当您调用pool.release(sessionwrapper)时,池会将包装器中的会话返回到池中,并将DummySession放入包装器中。这样你仍然可以访问有关会话的信息(例如主机,用户等),但不能调用任何方法。

我知道一些代码不会出错,但我希望描述很清楚。