Typen
- Für primitive Typen hat J2ObjC Typdefs im JNI-Stil definiert.
- Bei typischen Klassentypen wird die Camel-Case-Schreibweise des Pakets verwendet, die dem Klassennamen vorangestellt wird.
- Informationen zum Umbenennen des generierten Paketpräfixes finden Sie unter Paketpräfixe.
- Für den Basisobjekttyp und alle Typvariablen „id“ verwendet wird.
- Einige grundlegende Java-Typen werden Fundamenttypen zugeordnet. (z. B. String in NSString)
- Für Felder, die als flüchtig deklariert sind, hat J2ObjC mehr typedefs, die den Typ C11 _Atomic(...) verwenden.
- Bei inneren Typen wird der Name der inneren Klasse mit einem Unterstrich an den äußeren Namen angehängt.
Java-Typ | Objective-C-Typ | Veränderlicher Objective-C-Typ |
---|---|---|
boolean | jboolesch | volatile_jboolean |
char | Jchar | volatile_jchar |
Byte | JByte | volatile_jbyte |
kurz | JShort | volatile_jshort |
int | Jint | volatile_jint |
long | Jlong | volatile_jlong |
float | jfloat | volatile_jfloat |
double | JDouble | volatile_jdouble |
java.lang.Object | id | volatile_id |
Variablentyp | id | volatile_id |
java.lang.String | NSString* | volatile_id |
java.lang.Number | NSNumber* | volatile_id |
java.lang.Cloneable | NSCopy* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
Methoden
Objective-C-Methoden unterscheiden sich in zwei wichtigen Punkten von Java-Methoden. Sie sind syntaktisch die Parameter zwischen den Komponenten des Methodenselektors. Objective-C im Gegensatz zu Java, das Überladen nicht unterstützt. Diese Unterschiede werden durch Einbetten des Parametertypen in die generierte Auswahl ein. Dies ist notwendig, um Namenskonflikte zwischen überlasteten Java-Methoden.
Es gibt drei Arten von Java-Methoden, die sich in ihrer generierten API unterscheiden: Instanzmethoden, statische Methoden und Konstruktoren. Instanzmethoden werden in Objective-C-Instanzmethoden übersetzt. Statisch -Methoden und -Konstruktoren werden in C-Stil-Funktionen umgewandelt, fügen aber auch Objective-C-Wrapper zu eine vertrautere API für Objective-C-Entwickler bereitzustellen.
Instanzmethoden
Methodennamen werden so generiert:
- Methoden mit Nullparametern bleiben unverändert
- Mindestens ein Parameter verwendet das folgende Muster:
<ph type="x-smartling-placeholder">
- </ph>
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- Keyword-Regeln für Parameter:
<ph type="x-smartling-placeholder">
- </ph>
- Bei primitiven Typen entspricht das Schlüsselwort dem Namen des Java-Primitiven in Großbuchstaben. (z. B. „Zeichen“
- Bei nicht primitiven Typen ist das Schlüsselwort der vollständig qualifizierte Typname in Camel-Case-Schreibweise. (z. B. „ComGoogleFoo“)
- Für Arraytypen: „Array“ wird an das Keyword des Elementtyps angehängt.
Beispiel-Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Beispiel für Objective-C
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
Statische Methoden
Eine Objective-C-Klassenmethode wird mit denselben Benennungsregeln wie Instanzmethoden hinzugefügt.
Eine Funktion im C-Stil wird mithilfe der folgenden Benennungsregeln hinzugefügt:
- Beginnen Sie mit der generierten Objective-C-Auswahl. (z. B.
barWithInt:
) - Doppelpunkte durch Unterstriche ersetzen. (z. B.
barWithInt_
) - Stellen Sie dem Klassennamen einen Unterstrich voran, als Trennzeichen. (z. B.
ComGoogleFoo_barWithInt_
)
Beispiel-Java
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Beispiel für Objective-C
@interface Foo : NSObject
+ (jboolean)bar;
+ (jdouble)barWithIntArray:(IOSIntArray *)i;
+ (void)barWithNSString:(NSString *)s
withBoolean:(jboolean)b;
@end
FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();
FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);
FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);
Konstruktoren
Gemäß der Objective-C-Konvention wird eine init
-Instanzmethode hinzugefügt. Wenn der Konstruktor
wird dieselbe Benennungsregel wie bei den Instanzmethoden verwendet.
Es werden drei Funktionen im C-Stil hinzugefügt:
- Die erste Funktion akzeptiert ein neu zugewiesenes Objekt als ersten Parameter. Diese Funktion ist wird normalerweise zum Aufrufen von einem Unterklassenkonstruktor verwendet. Es gelten dieselben Benennungsregeln wie für statische . (wobei „init“ der Methodenname ist)
- Es werden zwei Funktionen hinzugefügt, mit denen das neue Objekt zugeordnet und initialisiert wird. Sie unterscheiden sich von
durch ihr Präfix:
<ph type="x-smartling-placeholder">
- </ph>
- Die Funktion
create_
gibt ein automatisch freigegebenes Objekt zurück. - Die Funktion
new_
gibt ein beibehaltenes Objekt zurück.
- Die Funktion
Beispiel-Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Beispiel für Objective-C
@interface ComGoogleFoo : NSObject
- (instancetype)init;
- (instancetype)initWithId:(id)a
withId:(id)b;
@end
FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();
FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);
Felder
Instanzfelder (nicht statisch)
Java-Instanzvariablen werden zu Objective-C-Instanzvariablen. Der Name wird mit einem nachfolgenden Unterstrich setzen. Einfache Felder, die als „endgültig“ erklärt werden sind Sonderfälle und werden nicht Variablen.
- Auf Felder kann direkt über „->“ zugegriffen werden Syntax.
- Einfache Felder können direkt festgelegt werden.
- Die endgültigen Primitive (Konstanten) werden wie statische Konstanten umgewandelt. (siehe Statische Felder)
- Nicht-primitive Felder müssen mit der angegebenen Setter-Funktion festgelegt werden:
<ph type="x-smartling-placeholder">
- </ph>
ClassName_set_fieldName_(instance, value)
Beispiel-Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Beispiel für Objective-C
Foo *foo = [[Foo alloc] init];
// Access a primitive field.
i = foo->myInt_;
// Set a primitive field.
foo->myInt_ = 5;
// Access a non-primitive field.
NSString *s = foo->myString_;
// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");
Statische Felder
Auf statische Variablen muss über die bereitgestellten Getter- und Setter-Funktionen zugegriffen werden. Diese Zugriffsfunktionen stellen sicher, dass die Klasseninitialisierung vor dem Zugriff auf die Variable erfolgt ist.
- Auf statische Felder zugreifen
<ph type="x-smartling-placeholder">
- </ph>
ClassName_get_fieldName()
- Ein (nicht finales) statisches Feld zuweisen
<ph type="x-smartling-placeholder">
- </ph>
ClassName_set_fieldName()
- Zeiger auf ein primitives statisches Feld abrufen
<ph type="x-smartling-placeholder">
- </ph>
ClassName_getRef_fieldName()
- Nur für nicht finale und nichtflüchtige Felder verfügbar.
Auf finale primitive Felder (Konstanten) kann ohne Bedenken direkt zugegriffen werden, da ihr Wert nicht von der Klasseninitialisierung abhängig ist.
ClassName_fieldName
Beispiel-Java
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Beispiel für Objective-C
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT; // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT(); // Class initialization
// Access a primitive field.
i = ComGoogleFoo_get_myInt();
// Set a primitive field.
ComGoogleFoo_set_myInt(5);
// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();
// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");
Enums
J2ObjC generiert für jede Java-Enum zwei Typen. Ein Objective-C-Klassentyp wird generiert, die volle Funktionalität einer Java-Enum. Außerdem wird mit der Foundation ein C-Enum generiert. NS_ENUM-Makro enthält. Der Klassentyp Objective-C wird von allen generierten APIs verwendet. Die C-Enum ist nützlich als konstante Werte für eine Switch-Anweisung oder als Speichertyp.
Die generierten enum-Typen haben folgende Namen:
- Die Objective-C-Klasse wird nach der gleichen Regel benannt wie eine reguläre Java-Klasse. (siehe Typen)
- Das C-Enum wird als reguläre Java-Klasse mit einem hinzugefügten "_Enum" bezeichnet. .
Auf Enum-Konstanten wird wie auf statische Felder zugegriffen.
Beispiel-Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Beispiel für Objective-C-Header
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
ComGoogleColor_Enum_RED = 0;
ComGoogleColor_Enum_GREEN = 1;
ComGoogleColor_Enum_BLUE = 2;
};
@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end
inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();
// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);