Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    2

    [JAVA] problemi nella modifica di oggetti e passaggi per valore

    Salve a tutti, ho un piccolo problemino in java che spero possiate aiutarmi a risolvere.
    Arrivo subito al dunque, so che in java tutto è passato per valore, e gli oggetti, il cui riferimento è passato per valore viene modificato anche se è passato ad una funzione come parametro, e la sua modifica all'interno della funzione si riperquote anche sull'oggetto iniziale. Tuttavia il seguente codice non funziona!

    codice:
    public class ObjectTest {
    
    	public static void main(String[] args) {
    
    
    		SemanticRule rule1 = new SemanticRule("Rule1");
    		rule1.addPropertyAtom("property1");
    		rule1.addPropertyAtom("property2");
    		rule1.addPropertyAtom("property3");
    		
    		System.out.println("The rule before: " + rule1);
    		
    		ObjectTest.modifyObject(rule1);
    		
    		System.out.println("The rule after: " + rule1);
    		
    
    	}
    	
    	public static boolean modifyObject(SemanticRule rule) {
    		
    		SemanticRule rule2 = rule.clone();
    
                    // modifico la copia
    		rule2.addPropertyAtom("property4");
    		if(rule2.removePropertyAtoms("property2")) {
    			rule = rule2;
    			return true;
                    }
    		return false;
    	}
    
    }
    
    class SemanticRule {
    
    	private String ruleId;
    	private List<String> properties;
    	
    	public SemanticRule(String ruleId) {
    		super();
    		this.ruleId = ruleId;
    		properties = new ArrayList<String>();
    	}
    	
    	public String getRuleId() {
    		return ruleId;
    	}
    
    	public void setRuleId(String ruleId) {
    		this.ruleId = ruleId;
    	}
    	
    	public void addPropertyAtom(String p) {
    		this.properties.add(p);
    	}
    	
    	
    	public List<String> getPropertyAtoms() {
    		return properties;
    	}
    	
    	public boolean removePropertyAtoms(String atom) {
    		return this.properties.remove(atom);
    	}
    	
    
    	@Override
    	public String toString() {
    		StringBuffer b = new StringBuffer();
    		b.append("Rule " + this.ruleId + " : \n\tProperty Predicates:    ");
    		for(String atom:this.properties) {
    			b.append(atom + "  ");
    		}
    		return b.toString();
    	}
    	
    	@Override
    	public SemanticRule clone() {
    		
    		SemanticRule newRule = new SemanticRule(this.ruleId);
    				
    		for(String atom:this.getPropertyAtoms()) {
    			newRule.addPropertyAtom(atom);
    		}
    		
    		return newRule;
    	}
    	
    }

    Il codice riportato è un estratto di un altro codice più complesso ovviamente.
    Le due copie

    codice:
    SemanticRule rule2 = rule.clone();
    ... // modifica dell'oggetto
    rule = rule2;
    anche se in questo codice sembrano inutili, sono necessarie nel mio codice. Sò che senza questa duplice copia, ma andando a modificare direttamente l'oggetto "rule" tutto funziona.
    Ma perchè se faccio una copia e lavoro sulla copia e poi ricopio la copia sull'oggetto originale (scusate il gioco di parole) non funziona?

    Chi mi sa aiutare?
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Java ha un forum dedicato dove ho spostato la discussione.
    PS: i tag da usare per il codice sono i tag CODE, non i QUOTE...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] problemi nella modifica di oggetti e passaggi per valore

    Originariamente inviato da deib
    Tuttavia il seguente codice non funziona!

    codice:
    public static void main(String[] args) {
        SemanticRule rule1 = new SemanticRule("Rule1");
        ......
        ObjectTest.modifyObject(rule1);
    }
    
    
    public static boolean modifyObject(SemanticRule rule) {
        ......
        rule = rule2;
        ......
    }
    Il punto è tutto qui. In modifyObject() tu assegni al parametro 'rule', che è tutta un'altra variabile, che semplicemente all'inizio ha una copia del reference contenuto in rule1 del main.

    Quello che tu assegni al parametro 'rule' di modifyObject non va assolutamente a cambiare il reference che è contenuto in 'rule1' del main!!!

    Il metodo riceve una copia del reference (non una copia dell'oggetto) e attraverso questo parametro puoi cambiare eventualmente lo "stato" dell'oggetto (se è "mutabile", invocando metodi setXXX o comunque altri che cambiano lo stato) ma non cambiare il reference che ha il metodo chiamante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    2
    Ho capito!!! grazie della chiara spiegazione!!
    posso risolvere il problema ora
    GRAZIE!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.