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
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.codice:SemanticRule rule2 = rule.clone(); ... // modifica dell'oggetto rule = rule2;
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

Rispondi quotando

