我在Wildfly服务器上使用Java和JSF。 我有一个远程EJB,其中一个函数修改Bean中的对象。
这两个有什么区别? 分配对象
public void updateStatus() {
for (TCSInstance i : tcsInstanceObjects) {
i = tcsClient.updateServerStatus(i);
}
}
设置值
public void updateStatus() {
for (TCSInstance i : tcsInstanceObjects) {
TCSInstance obj = tcsClient.updateServerStatus(i);
i.setStatus(obj.getStatus());
i.setVersion(obj.getVersion());
}
}
我的远程EJB中的updateServerStatus函数
public TCSInstance updateServerStatus(TCSInstance tcsInstanceObject) {
List<String> returnValues = new ArrayList<String>();
String pattern = ".*(\\d{2}\\.\\d{2}\\.\\d{2}\\.\\d{2}).*";
Pattern p = Pattern.compile(pattern);
if (connect(tcsInstanceObject.host, tcsInstanceObject.port)) {
returnValues = readFromServer(stopValueBeforeLog);
tcsInstanceObject.setStatus("Active");
Matcher m = p.matcher(returnValues.toString());
if (m.find()) {
tcsInstanceObject.setVersion(m.group(1));
} else {
tcsInstanceObject.setVersion(returnValues.toString());
}
disconnect();
} else {
tcsInstanceObject.setStatus("Not Active");
}
return tcsInstanceObject;
}
如您所见,我在EJB中设置版本和状态,然后返回对象。
选项1分配不起作用。 版本和状态未定义。
选项2完美无缺。
但为什么呢?有人可以告诉我吗?
EDIT TCSInstance类
package com.six_group.dsx.tat.tcs.web.data;
import java.io.Serializable;
public class TCSInstance implements Serializable {
public String env;
public String host;
public int port;
public String dir;
public String version;
public String status;
public TCSInstance(String _env, String _host, String _port, String _dir, String _version) {
this.env = _env;
this.host = _host;
this.port = Integer.parseInt(_port);
this.dir = _dir;
this.version = _version;
this.status = null;
}
public TCSInstance() {
// TODO Auto-generated constructor stub
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getEnv() {
return env;
}
public void setEnv(String env) {
this.env = env;
}
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public void setHost(String host) {
this.host = host;
}
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
public String getHost() {
return host;
}
}
答案 0 :(得分:1)
当你这样做时
i = tcsClient.updateServerStatus(i);
你没有分配对象,你分配一个变量。赋值前的变量引用一个对象;在赋值之后它引用另一个对象。除非在赋值后使用变量,否则赋值无效。
另一方面,当您设置对象的属性时,您可以更改现有对象,以便看到效果。
如果要用对象不可变替换对象,则需要修改存储对象的集合(即{{1} })。但是,您需要小心,因为不允许对正在迭代的集合进行修改。您需要使用迭代器才能正确执行。
如果我修改函数并将整个
tcsInstanceObjects
列表添加为参数而不是列表中的一个对象,则可以正常工作。如果我在TCSInstanceObjects
中迭代List,然后返回整个updateServerStatus()
有什么区别?
这正是我上面描述的情况:你从一个具有一组对象的容器开始,然后你创建另一个具有修改过的对象集的容器,最后用新容器替换旧容器。这就是为什么一切正常的原因。