2 waaulwh waaulwh 于 2016.03.07 10:53 提问

java单例模式传参问题 5C

用sshexec连接linux
ConnBean connInfo = new ConnBean(remoteAddress, userName, password);
SSHExec sshExec = SSHExec.getInstance(connInfo); 假设每次传过来的conninfo参数是变的,但是debug查看每次都是第一次的参数。
private static SSHExec ssh;
public static SSHExec getInstance(ConnBean conn)
{
if(ssh == null)
ssh = new SSHExec(conn);
return ssh;
}
这个该怎么处理?

6个回答

lianshaohua
lianshaohua   2016.03.07 12:41

你的这处情况不适合用单例模式;
如果非要用单例模式也不是不可以,那就把这个实例增加一个设备参数的函数setinfi(),以后调用时如此调用: SSHExec.getInstance().setinfo(connInfo);

u013829202
u013829202   Rxr 2016.03.07 15:43

单利模式。你使用过一次,后来取到的都是同一个实例对象的。 你理解的还是不透彻

broust
broust   2016.03.07 11:51

if(ssh == null)
ssh = new SSHExec(conn);
return ssh;
}
所以每次都返回第一次生成的instance啊。
如果你的场景是有很多remoteAddress,那么这个public static SSHExec getInstance(ConnBean conn)方法修改下,里面用一个hashMap来存已经初始化的实例。
类似
if(map.get(conn.getRemoteAddress)==null){
xxxxx
}

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.07 12:58

那要看你的构造函数是怎么使用这个参数的啊, new SSHExec(conn);你是直接用的conn的吗?
而且还有,一旦你使用过一次getInstance后,后面每次取到的都是同一个实例对象的。这也是单利模式的特征啊,就是始终返回同一个实例对象。

qq_20039385
qq_20039385   2016.03.07 14:36

你程序写的就是一个单列,对象只有一个,你可以像楼上说的改成
if(map.get(conn.getRemoteAddress)==null){
ssh = new SSHExec(conn);
}
这样就好似不同的remoteAddress获取不同的对象。

tongyi55555
tongyi55555   2016.03.09 03:05

单例模式考的最多的啊

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!