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