2016-10-18 6 views
1

WildflyサーバーでJavaとJSFを使用しています。 私は、関数がBeanからオブジェクトを変更するリモートEJBを持っています。オブジェクトの割り当てとその値の設定の違い

これらの2の違いは何ですか? あなたは、私がEJBでのバージョンとステータスを設定しています見ることができるように私のリモート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; 
    } 

の値

public void updateStatus() { 
    for (TCSInstance i : tcsInstanceObjects) {   
     TCSInstance obj = tcsClient.updateServerStatus(i); 
     i.setStatus(obj.getStatus()); 
     i.setVersion(obj.getVersion()); 
    } 
} 

updateServerStatus機能を設定するオブジェクトに

public void updateStatus() { 
    for (TCSInstance i : tcsInstanceObjects) {   
     i = tcsClient.updateServerStatus(i); 
    } 
} 

の割り当てとオブジェクトを返します。

オプション1の割り当ては機能しません。 バージョンとステータスは未定義です。

オプション2は完全に機能します。

なぜですか?誰かが私に教えてくれますか?あなたはこの

i = tcsClient.updateServerStatus(i); 

を行うと

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

'TCSInstance'クラスの' getStatus() 'と' getVerison() 'メソッドには何らかの処置がありますか? –

+0

'i = tcsClient.updateServerStatus(i);'という行は、私にとっては非常に奇妙に見えます。 – px06

+0

@andolsiziedいいえ私はあなたの 'TCSInstance'クラスを共有する値 – Sundaze

答えて

1

あなたは変数を割り当てるには、オブジェクトを割り当てないでください。代入前の変数は1つのオブジェクトを参照します。代入の後、別のオブジェクトを参照します。代入後に変数を使用しない限り、代入は無効です。

一方、オブジェクトのプロパティを設定すると、既存のオブジェクトが変更され、その結果が表示されます。

あなたのオブジェクトが不変ある場合に必要な別のもの、でオブジェクトを置換したい場合は、あなたのオブジェクトが格納されているコレクション(すなわちtcsInstanceObjects)を変更する必要があります。ただし、反復されているコレクションの変更は許可されていないため、注意する必要があります。正しく実行するにはイテレータを使用する必要があります。

もし私が関数を変更し、一覧から1つのオブジェクトの代わりにTCSInstanceObjectsリスト全体を追加すると、それは動作します。私はupdateServerStatus()でリストを反復して、全体

list: tcsInstanceObjects = tcsClient.updateServerStatus(tcsInstanceObjects); 
を返す場合

違いは何ですか?

これは、私が上で説明したのとまったく同じ状況です。オブジェクトのセットが1つのコンテナから始め、次に変更されたオブジェクトセットを持つ別のコンテナを作成し、最後に古いコンテナを新しいコンテナ。それがすべて正常に動作する理由です。

+0

@andolsiziedあなたが私の他の答え 'updatePerson'メソッドに応答して投稿したコードでは、すべての作業を行っていました。 {person = updatePerson(person);}を{updatePerson(person);}に置き換えることができ、すべてが引き続き機能します。つまり、割り当ては完全に無関係です。スニペット#1ではなくOPのスニペット#2を書き換えました。 – dasblinkenlight

関連する問題