java - 分配我的对象或在其中设置值有什么区别

标签 java

我正在 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 in updateServerStatus() and then return the whole

list: tcsInstanceObjects = tcsClient.updateServerStatus(tcsInstanceObjects); 

What is the difference ?

这正是我上面描述的情况:您从一个包含一组对象的容器开始,然后创建另一个包含修改后的对象组的容器,最后用新容器替换旧容器。这就是为什么一切都能正常工作的原因。

关于java - 分配我的对象或在其中设置值有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105137/

相关文章:

java - 将显示 jComboBox 的渲染器链接到 jTable 中的单元格

java - 如何使用 Java 故障转移到 AWS RDS MySQL 副本

java - Wildfly 服务器在 Wildfly :start 后关闭

java - 将字符串传递给 VARCHAR 字段时不支持的 SQL 类型 1111

java - 使用 jFrame 数组?

java - 网络流量中的网络过滤器是什么样的

java - 使用 C# 检测特定程序何时关闭

java - 在单个线程中处理多个无限任务? P.S 一次运行一个任务并从外部控制其任务行为(即启动/停止任务)

java - Java 中字节数组是否初始化为零?

java - JTree数据库节点选择并显示在java中的文本字段中