Klassennamenzuordnung
Da J2ObjC nur Java-Klassen übersetzt, die nicht auf der Benutzeroberfläche basieren, muss eine iOS-Anwendung direkt mit den übersetzten Klassen funktionieren. Übersetzte Klassen sind reguläre NSObject-gerootete Objective-C-Klassen. Es ist jedoch hilfreich, um zu verstehen, wie Klassen-, Methoden-, Parameter- und Header-Dateinamen konvertiert werden.
Java verwendet Pakete, um Namespaces zu definieren. Objective-C hat keine Pakete und hat stattdessen eine Konvention, ein gemeinsames Präfix vor ähnlichen Klassen wie NSObject und NSString zu platzieren. Zum Beibehalten von Java-Namespaces werden Paketnamen einem Präfix mit Camel-Case-Schreibweise zugeordnet. Beispielsweise ist java.util.List
standardmäßig JavaUtilList
zugeordnet. Dieses Standardpräfix kann explizit mit den Paketpräfixoptionen von j2objc festgelegt werden.
Parameternamen
Java unterscheidet zwischen überlasteten Methoden durch ihre Argumenttypen, während Objective-C Argumentnamen verwendet. J2ObjC erstellt daher Argumentnamen aus deren Typen. So wird beispielsweise ein Objekt am Anfang eines ArrayList
eingefügt und diese Liste dann einer anderen Liste hinzugefügt:
[someList addWithInt:0 withId:object];
[otherList addAllWithJavaUtilCollection:somelist];
Jeder Argumentname besteht aus „with“ plus seinem Typ. Das ist etwas hässlich, sorgt aber dafür, dass in Objective-C immer dieselbe Methode aufgerufen wird wie in Java.
Headernamen
Die Namen von Header-Dateien werden jedoch nicht zugeordnet. Stattdessen wird der Java-Quelldateipfad mit „.h“ statt „.java“ enden. Dies erleichtert die Unterstützung von Tools wie Xcode und Make, kann jedoch anfangs etwas verwirrend sein, da:
#import "java/util/Date.h"
Die JavaUtilDate
-Klasse wird deklariert, nicht die Date
.
Übersetzte Klassen verwenden
Neben den ungeraden Namen, die mit Paketpräfixen vereinfacht werden können, werden übersetzte Klassen wie alle anderen Objective-C-Klassen verwendet:
#import "java/util/BitSet.h"
...
JavaUtilBitSet *bitset = [[JavaUtilBitSet alloc] init];
[bitset setWithInt:10 withBOOL:YES];
BOOL b = [bitset getWithInt:10];