Dies ist eine Frage für Java. Ich habe eine Schnittstelle IMyObjectPredicate
genannt, die ein einzelnes Testverfahren implementiert, um eine Eingabe gelten:Anonyme Klassen übergeben
public interface IMyObjectPredicate {
boolean test(MyObject x);
}
Was würde Ich mag in der Lage sein, eine Instanz von IMyObjectPredicate
passieren um zwischen Objekten und haben die test
Funktion aktualisieren ihre Referenzen zu den Variablen des neuen Objekts, an das es übergeben wird. Betrachten wir zum Beispiel eine Klasse, die Verwendung dieses Prädikat macht:
public class Tester {
MyObject o;
IMyObjectPredicate myTestFunction;
int myThreshold;
public Tester(/*stuff*/) {
/*Code here which initialises the Tester instance and 'myThreshold'*/
myTestFunction = new IMyObjectPredicate() {
@Override
public boolean test(MyObject o) {
return (o.value() > myThreshold);
}
};
}
pubic boolean isGood() {
return myTestFunction.test(o);
}
}
würde ich einen tiefen Klon in der Lage sein mag des Testers Objekt auszuführen aus Gründen, die ich hier nicht näher eingehen. Aber die Idee ist, dass die geklonte Instanz von Tester
das Prädikat gegen seinen eigenen Wert von myThreshold
testen sollte, nicht die myThreshold
der ersten Instanz verweisen. Aber wenn ich myTestFunction
an eine neue Instanz von Tester
übergebe, denke ich, dass es immer noch den Wert myThreshold
der ersten Instanz referenzieren wird, anstatt myThreshold
basierend auf der Referenz der einschließenden Klasse dynamisch zu bewerten.
Wie kann ich die Übergabe eines IMyObjectPredicate
Objekts erreichen, dessen Testfunktion Verweise auf die Felder des neuen Objekts verwendet, das an übergeben wird?
Edit: Erschwerend kommt hinzu, dass in der Regel wird es nicht möglich sein myTestFunction
aus den Bereichen innerhalb eines Tester
Objekt nur zu rekonstruieren. myTestFunction
kann von anderen Teilen des Programms in einer Weise überschrieben werden, die nicht mit den anderen Feldern von Tester
korreliert. Ich kann diese Funktionalität opfern, wenn es sein muss, aber ich würde lieber nicht wegen der Eleganz.
Ich würde nicht erwarten, dass dies möglich ist.Aber wenn es im Konstruktor ist, können Sie einfach ein neues Prädikat erstellen. –
@LouisWasserman Im Allgemeinen wird 'myTestFunction' im Laufe des Programms geändert. Ich möchte es bei Bedarf nach Bedarf kopieren können. – Myridium
Ihr anonymer Impl von 'IMyObjectPredicate' hat eine no-arg' test() 'Methode, aber die Schnittstelle benötigt ein' MyObject' Argument ...? –