Wie stellt man es nun an, diese Bibliothek auf Quelltextebene einzubinden ohne zur Laufzeit auf anderen Systemen eine Fehlermeldung zu erhalten?
Das prizipielle Vorgehen wird im Abschnitt Strategy-Pattern erläutert. Dem entsprechend wird eine Klasse MacImpl deklariert, die einerseits Apples Pakete
com.apple.eawt.Application;
com.apple.eawt.ApplicationEvent;
com.apple.eawt.ApplicationListener;
einbindet, andererseits ein kleines Interface ClassSelector
implementiert. Es deklariert nur eine Methode handleOS(). Sie kann
je nach Betriebssystem in unterschiedlichen Klassen konkretisiert werden.Die Methode handleOS() erzeugt im vorliegenden Fall ein Application-Objekt, auf dem der Reihe nach Methoden aufgerufen werden, um
- ein Dock-Icon darzustellen
- einen About-Menupunkt darzustellen
- einen Eigenschaften-Menupunkt zu erzeugen und darzustellen
- die Applikation beim Listener anzumelden
Der "Witz" besteht jetzt darin, dass in main() durch die Zeile
System.getProperties().put("apple.laf.useScreenMenuBar", "true");
zunächst die Nutzung der Menuleiste angefordert wird. Das muss bereits
an dieser Stelle erfolgen, um die vollständige Darstellung der
Apple-Leiste zu gewährleisten. Da es sich hierbei lediglich um den
Eintrag einer Systemeigenschaft handelt, wird auf anderen Betriebssystemene
hierdurch kein Fehler erzeugt. In der Folge wird das Betriebssystem
abgefragt und erst dann wird, je nach Ergebnis, die entsprechende Klasse
aufgerufen. Das garantiert, dass nicht vorhandene Bibliotheken zur Laufzeit
auch nicht benötigt werden.