Übersetzungsreferenz

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.
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);