So geben Sie Präfixe für Paketnamen an.

Namenszuordnung

Java verwendet Pakete, um Namespaces informell zu definieren. Ziel-C++ hat C++-Namespaces, Ziel-C hingegen nicht. Um die Eindeutigkeit des Namens beizubehalten, wenn Klassen aus mehreren Paketen verwendet werden, stellt J2ObjC dem Typnamen eine Kamelversion des Pakets voran. java.util.Map wird beispielsweise in JavaUtilMap umbenannt.

Leider kann die Schreibweise von generierten Kachelnamen die Lesbarkeit des generierten Codes beeinträchtigen, insbesondere bei langen Paketnamen. So befindet sich beispielsweise die Beta-Annotation von Google Guava im Paket com.google.common.annotations und ComGoogleCommonAnnotationsBeta ist schwieriger zu lesen als Beta.

Paketpräfix definieren

Die Objective-C-Konvention zum Definieren informeller Namespaces besteht darin, ein gemeinsames Präfix zu verwenden, normalerweise zwei Buchstaben. Das iOS Foundation Framework verwendet beispielsweise „NS“ (aus NeXTStep). Um den Betanamen von Google Guava zu vereinfachen, verbessert ein Präfix wie „GG“ die Lesbarkeit, indem es Beta als GGBeta bezeichnet.

J2ObjC unterstützt Entwickler dabei, ihre eigenen Präfixe für die Zuordnung zu Paketnamen anzugeben. Dies erfolgt in der Befehlszeile mit --prefix package=prefix. Zum Kürzen aller Klassennamen im Paket von Beta wird „--prefix com.google.common.annotations=GG“ verwendet. Für jedes Paket ist eine separate Präfixdeklaration erforderlich.

Einzelnes Präfix für mehrere Pakete definieren

Kleinere Bibliotheken haben oft Java-Klassennamen, die keine Konflikte verursachen. Deshalb können sie ein einzelnes Präfix gemeinsam mit einer Paketspezifikation mit Platzhaltern verwenden. Beispielsweise können alle Joda-Time-Pakete das gleiche JT Präfix mit --prefix 'org.joda.time.*=JT' teilen. Das einzige unterstützte Platzhalterzeichen ist „*“, das ebenso wie die Befehlszeile mit Dateinamen übereinstimmt.

Mehrere Paketpräfixe definieren

Zur Vereinfachung der Angabe mehrerer Präfixdefinitionen kann eine Attributdatei mit dem Argument „--prefixes file“ verwendet werden:

cat prefixes.properties
com.google.common.annotations: GG
com.google.common.base: GG

# While GG can be used for all packages, let's mix it up.
com.google.common.collect: GC
com.google.common.io: GIO        # A prefix can be more than two characters,
com.google.common.net: GuavaNet  # a lot more!
...
j2objc --prefixes prefixes.properties <args>

Vorangegangene Klassen zur Laufzeit

Da die fertige Anwendung Klassen mit Präfixen hat, können sie standardmäßig nicht mit dem ursprünglichen Java-Klassennamen gefunden werden. Wenn die App jedoch eine Datei mit dem Namen prefixes.properties in ihrem Ressourcen-Bundle mit den für die Übersetzung verwendeten Präfixen enthält, findet Class.forName(javaName) die zugeordnete Klasse.

Wenn Sie die oben erwähnte Datei prefixes.properties in Xcode in eine iOS-App einfügen möchten, öffnen Sie den Tab „Build-Phasen“ des Build-Ziels, maximieren Sie den Abschnitt „Bundle-Ressourcen kopieren“ und fügen Sie der Liste die Datei prefixes.properties hinzu. Unter Java-Ressourcen finden Sie weitere Informationen dazu, wie Java-Ressourcenkonzepte iOS-Ressourcen zugeordnet werden.