Supporti Java passano per valore (funziona sempre su una copia) ma quando si passa un oggetto definito dall'utente, esso cambia l'oggetto reale (tipo di passaggio per riferimento ma nessun puntatore cambia), che I capisci, ma perché il metodo changeObject2CLEAR di seguito sta effettivamente cambiando il valore dell'oggetto? Invece deve lavorare sulla copia?Problema con valore in java
import java.util.HashMap;
import java.util.Map;
public class PassBy {
class CustomBean {
public CustomBean() {
}
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id + ", " + name;
}
}
public Map<Integer, String> changeObject2NULL (Map<Integer, String> m) {
m = null;
return m;
}
public Map<Integer, String> changeObject2CLEAR (Map<Integer, String> m) {
m.clear();
return m;
}
public CustomBean changeCustomObject (CustomBean _e) {
_e.setId(_e.getId() + 1);
return _e;
}
public static void main(String[] args) {
PassBy passby = new PassBy();
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "value");
CustomBean bean = passby.new CustomBean();
bean.setId(1);
bean.setName("arun");
// Initial Value
System.out.println(map.toString());
System.out.println(bean.toString());
System.out.println("-------------------------");
// Pass by value works fine
passby.changeObject2NULL(map);
passby.changeCustomObject(bean);
// Custom object value changes since we pass as the object reference but Map remains with actual value
System.out.println(map.toString());
System.out.println(bean.toString());
System.out.println("-------------------------");
// Testing Pass by value - CANT UNDERSTAND why it changed the object since it has to be pass-by-value and not by ref in this case ??
// Why setting to null not chainging the value but clear does ?
passby.changeObject2CLEAR(map);
System.out.println(map.toString());
}
}
Stai passando il * riferimento * in base al valore. Un sacco su questo su Google. Buona domanda però. – Bathsheba
@Arun Ho aggiornato la mia risposta per indirizzare la forma raffinata della tua domanda –
In breve 'changeObject2NULL (Map m)' contiene la propria variabile * local * 'm', che è anche il parametro del metodo. Quando si utilizza questo metodo come 'changeObject2NULL (map)' 'm' copia le informazioni su quale oggetto' map' tiene (questo indirizzo è * valore * della variabile 'map'). Quindi quando chiamate 'm.clear()' invoca il metodo 'clear' sullo stesso oggetto che' map' tiene in modo da poter vedere il nuovo stato di quell'oggetto tramite 'map'.Quando si chiama 'm = null' si cambia semplicemente quale oggetto' m' vale per 'null'; questo non influenza 'map' né l'oggetto a cui si riferisce. –
Pshemo