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

时间:2016-10-18 09:57:40

标签: 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完美无缺。

但为什么呢?有人可以告诉我吗?

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;
    }
}

1 个答案:

答案 0 :(得分:1)

当你这样做时

i = tcsClient.updateServerStatus(i);

你没有分配对象,你分配一个变量。赋值前的变量引用一个对象;在赋值之后它引用另一个对象。除非在赋值后使用变量,否则赋值无效。

另一方面,当您设置对象的属性时,您可以更改现有对象,以便看到效果。

如果要用对象不可变替换对象,则需要修改存储对象的集合(即{{1} })。但是,您需要小心,因为不允许对正在迭代的集合进行修改。您需要使用迭代器才能正确执行。

  

如果我修改函数并将整个tcsInstanceObjects列表添加为参数而不是列表中的一个对象,则可以正常工作。如果我在TCSInstanceObjects中迭代List,然后返回整个

updateServerStatus()
     

有什么区别?

这正是我上面描述的情况:你从一个具有一组对象的容器开始,然后你创建另一个具有修改过的对象集的容器,最后用新容器替换旧容器。这就是为什么一切正常的原因。