2016-10-18 4 views
1

Wildfly 서버에서 Java 및 JSF로 작업하고 있습니다. 함수가 Bean의 객체를 수정하는 원격 EJB가 있습니다.내 개체 할당 또는 값 설정의 차이점

이 2의 차이점은 무엇입니까? 는 값

설정 객체

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

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

에서

updateServerStatus 기능 당신은 내가 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; 
    } 
} 
+0

'TCSInstance' 클래스의'getStatus()'와'getVerison()'메소드에 치료법이 있습니까? –

+0

'i = tcsClient.updateServerStatus (i);'행은 나에게 이상하게 보인다. – px06

+0

@andolsizied 아니요 그냥 값 – Sundaze

답변

1

i = tcsClient.updateServerStatus(i); 

이 개체를 할당하지 할 때, 당신은 변수를 할당합니다. 할당 이전의 변수는 하나의 객체를 참조합니다. 할당 후에 다른 객체를 참조합니다. 할당 후에 변수를 사용하지 않으면 할당이 효과가 없습니다.

반면에 개체의 속성을 설정하면 기존 개체가 변경되므로 효과를 볼 수 있습니다.

당신이 당신의 객체가 불변을 때 필요한 다른 한 가지는 객체를 교체하려는 경우, 당신은 당신의 객체가 저장되는 컬렉션 (즉 tcsInstanceObjects)를 수정해야합니다. 그러나 반복되는 컬렉션에 대한 수정은 허용되지 않으므로주의해야합니다. 올바르게하려면 iterator를 사용해야한다.

내가 함수를 수정하고 목록에서 하나의 개체 대신 매개 변수로 전체 TCSInstanceObjects 목록을 추가하면 작동합니다. 나는 updateServerStatus()의 목록을 반복하고 전체

list: tcsInstanceObjects = tcsClient.updateServerStatus(tcsInstanceObjects); 

차이점은 무엇입니까를 반환하는 경우?

정확히 내가 위에서 설명한 상황입니다. 한 세트의 개체가있는 컨테이너로 시작한 다음 수정 된 개체 집합이있는 다른 컨테이너를 만들고 마지막으로 이전 컨테이너를 새로운 컨테이너. 그것이 모든 것이 올바르게 작동하는 이유입니다.

+0

@andolsizied 제 다른 대답 인'updatePerson'에 대한 응답으로 게시 한 코드에서 모든 작업을 수행하고있었습니다. {person = updatePerson (person);}을 {updatePerson (person);}으로 바꿀 수 있으며 모든 작업이 계속됩니다. 즉, 할당은 완전히 관련이 없습니다. 당신은 스 니펫 # 1이 아닌 OP의 스 니펫 # 2를 다시 썼습니다. – dasblinkenlight