2016-06-16 10 views
0

Возможно ли в Java хранить объект, который вы хотите, и изменять его значения?Сторнирование объекта и его использование

Я работаю над сервером-клиентом rmi, и хочу сохранить своих клиентов на ArrayList на моем сервере. Это казалось хорошим, пока я не попытался изменить значения клиента непосредственно с сервера. Если бы я использовал C++, я бы объявил указатель.

Я называю мой метод с кодом look_up.LogIn(this);

Сервер:

@Override 
public void LogIn(Client temp) throws RemoteException { 
    for (Client arr : users) { 
     if (arr.equals(temp)) { 
      temp.setID(0); 
     } 
    } 
    // users.add(temp); 
    Random rand = new Random(); 

    int randomNum = rand.nextInt((100 - 1) + 1) + 1; 
    boolean flag = false; 

    do { 
     for (Client arr : users) { 
      if (arr.getId() == randomNum) { 
       flag = true; 
      } 
     } 
    } while (flag); 
    temp.setID(randomNum); 
    System.out.println("Id we .. : " + temp.getId()); 
    users.add(temp); 

} 

код клиента:

if (e.getSource() == logIn) { 
    try { 
     look_up.LogIn(this); 
     if (this.id != 0) {      
      JOptionPane.showMessageDialog(frame, "Loged in Succesfully"); 
      logIn.setEnabled(false); 
      submit.setEnabled(true); 
      information.setText(look_up.check_Files()); 
      tempValue = this.id; 
      System.out.println("Temp value afer login : " + tempValue); 
     } else { 
      JOptionPane.showMessageDialog(frame, "Sorry but somthing went wrong try to log in again..."); 
     } 
    } catch (RemoteException ex) { 
     System.err.println("Object cant be send"); 
     ex.printStackTrace(); 
    } 
} 

Эти строки кода работают только если определить мой LogIn, как int и вернуть значение случайного числа. Когда я попытался изменить его, я получил ошибку.

Странно, что когда я установил temp.setId, он работал и печатался хорошо, но на клиентах фактический экземпляр экземпляра остался 0. Как это возможно?

ответ

0

Я не могу понять, что происходит с целым циклом, но вы, кажется, ожидаете, что параметр, переданный серверу, волшебным образом изменит его значение на клиенте. Это предает полное непонимание того, что происходит. Client явно Serializable, поэтому он передается по значению серверу. Любые изменения, внесенные в этот объект на сервере, будут не быть отражены в клиентах. Если вы хотите получить результат, вы должны вернуть его из удаленного метода в качестве результата.