Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Habe ich eigentlich auch bei der Verwendung von anonymen Klassen in Java die Möglichkeit Methoden wie getter, setter und andere individuelle Methoden aufzurufen, die diese Klasse möglicherweise implementiert hat (unabhängig davon, ob es fachlich einen Sinn machen würde, sondern eher aus dem technischen Blickwinkel betrachtet)?
Ich frage deshalb, weil ich ja keine Referenzvariable nutze, um mit dieser Klasse und dem instanziierten Objekt zu kommmunizieren.
Das Problem ist weniger die fehlende Referenz, das kann man ja noch hinschreiben. Das Problem ist vielmehr dass es keinen Typ gibt auf den man casten könnte:
Java:
public class Test
{
public static void main(String[] args) throws Exception
{
Comparator<String> anonym = new Comparator<String>()
{
private boolean reverse;
public void setReverse(boolean reverse)
{
this.reverse = reverse;
}
@Override
public int compare(String o1, String o2)
{
if(reverse)
return o1.compareTo(o2);
else
return o2.compareTo(o1);
}
};
String a = "a";
String b = "b";
System.out.println(anonym.compare(a, b));
//anonym.setReverse(true); geht nicht da anonym vom Typ Comparator ist.
//Per Reflection kommt man dran
Class<? extends Comparator> clazz = anonym.getClass();
Method setReverse = clazz.getDeclaredMethod("setReverse", Boolean.TYPE);
setReverse.invoke(anonym, true);
System.out.println(anonym.compare(a, b));
}
}
Zwar gibt es einen Typ innerhalb der VM, dieser heißt in diesem Fall Test$1, daher funktioniert das per Reflection, aber auf Test$1 kann nicht gecastet werden. Das ganze per Reflection zu machen geht zwar ist aber richtig häßlich.
Schon klar, aber das Thema geht um anonyme Klassen und ob man Methoden der anonymen Klasse aufrufen kann. Antwort nein es geht nicht, außer man nutzt Reflection.
mach Dir einen abstrakten ReversableComparator, der reverse getted/setted, eine compareElements - Methode fordert und selbst dann compare mit der Reverse- Mimik überlädt, der geht dann für alles.
Java:
public abstract class ReversablComparator<T> extends Comparator<T> {
private boolean reverse;
public boolean isReverse() {
return reverse;
}
public boolean setReverse( boolean reverse ) {
this.reverse = reverse;
}
public abstract int compareElements( T obj1, T obj2 );
@Override
public int compare (T o1, T o2 ) {
if (isReverse()) {
return compareElements( o2, o1 );
} else {
return compareElements( o1, o2 );
}
}
}
Wenn Du die implementierst, geht alles so , wie Du willst, und die compareElements braucht auch das reverse nicht zu implementieren.