Lokale Klasse für einen Timer nutzen
Damit die Beispiele etwas praxisnäher werden, wollen wir uns anschauen, wie ein Timer wiederholende Aufgaben ausführen kann. Die Java-Bibliothek bringt hier schon alles mit: Es gilt ein Exemplar von java.util.Timer() zu bilden und der Objektmethode scheduleAtFixedRate(…) ein Exemplar vom Typ TimerTask zu übergeben. Die Klasse TimerTask schreibt eine abstrakte Methode run() vor, in die der parallel und regelmäßig abzuarbeitende Programmcode gesetzt wird.
Nutzen wir das für ein Programm, welches uns sofort und regelmäßig daran erinnert, wie wichtig doch Sport ist:
public class SportReminder {
public static void main( String[] args ) {
class SportReminderTask extends TimerTask {
@Override public void run() {
System.out.println( "Los, beweg dich du faule Wurst!" );
}
}
new Timer().scheduleAtFixedRate( new SportReminderTask(), 0 /* ms delay */, 1000 /* ms period */ );
}
}
Unser Klasse SportReminderTask, die TimerTask erweitert, ist direkt in main(…) deklariert. Das erzeugte Exemplar kommt später in scheduleAtFixedRate(…) und los rennt der Timer, um uns jede Sekunde an die Wichtigkeit von Bewegung zu erinnern.
Nutzung einer anonymen innerer Klassen für den Timer
Eben gerade haben wir für den Timer extra eine neue lokale Klasse deklariert, aber genau genommen haben wir diese nur einmal nutzen müssen, nämlich um ein Exemplar bilden, und scheduleAtFixedRate(…) übergeben zu können. Das ist ein perfektes Szenario für anonyme innere Klassen. Aus
class SportReminderTask extends TimerTask {
@Override public void run() { … }
}
new Timer().scheduleAtFixedRate( new SportReminderTask(), … );
wird
new Timer().scheduleAtFixedRate( new TimerTask() {
@Override public void run() {
System.out.println( "Los, …" );
}
},
0 /* ms delay */,
1000 /* ms period */);
Im Kern ist es also eine Umwandlung von new SportReminderTask() in new TimerTask() { … }. Von dem Klassennamen SportReminderTask ist nichts mehr zu sehen, das Objekt ist anonym.