我正在 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 效果很好。
但是为什么呢?有人可以告诉我吗?
编辑 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;
}
}
最佳答案
当你这样做时
i = tcsClient.updateServerStatus(i);
您不分配对象,而是分配变量。赋值前的变量引用一个对象;赋值后它引用另一个对象。除非您在赋值后使用该变量,否则赋值无效。
另一方面,当您设置对象的属性时,您会更改现有对象,因此您会看到效果。
如果您想用另一个对象替换一个对象(当您的对象不可变时这是必要的),您需要修改存储对象的集合(即tcsInstanceObjects
)。但是,您需要小心,因为不允许修改正在迭代的集合。您需要使用迭代器才能正确完成此操作。
if I modify the functions and add the whole
TCSInstanceObjects
list as a parameter instead of one object from the list, it works. If I iterate over the List inupdateServerStatus()
and then return the wholelist: tcsInstanceObjects = tcsClient.updateServerStatus(tcsInstanceObjects);
What is the difference ?
这正是我上面描述的情况:您从一个包含一组对象的容器开始,然后创建另一个包含修改后的对象组的容器,最后用新容器替换旧容器。这就是为什么一切都能正常工作的原因。
关于java - 分配我的对象或在其中设置值有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105137/