Typ
- W przypadku typów podstawowych J2ObjC ma zdefiniowane typy typów w formacie JNI.
- W przypadku typowych typów zajęć pakiet jest zapisany wielką literą i dołączony do nazwy zajęć.
- Aby zmienić nazwę wygenerowanego prefiksu pakietu, zobacz Prefiksy pakietu.
- W przypadku podstawowego typu obiektu i wszystkich zmiennych typu używany jest „id”.
- Kilka podstawowych typów Java jest mapowanych na typy fundamentów. (np. String (ciąg znaków) do NSString)
- W przypadku pól deklarowanych jako „zmienne” J2ObjC ma więcej definicji typu korzystających z typów C11 _Atomic(...).
- W przypadku typów wewnętrznych nazwa klasy wewnętrznej jest dodawana z podkreśleniem.
Typ Java | Typ celu C | Typ zmiennych: cel C |
---|---|---|
wartość logiczna | Jwartość | wartość_logiczna |
znak | Jchar | _charakterystyczny_jchar |
bajt | JB | _bajt_wolny |
krótki | krótka | zmiennoprzecinkowy_jshort |
int, | dzong | porcja_zniekształcona |
długi | Jlong | zmiennoprzecinkowy_jlong |
liczba zmiennoprzecinkowa | Jpływający | zmienna_zmienna |
liczba zmiennoprzecinkowa | dwójka | zmiennoprzecinkowy_podwójny |
java.lang.Object | id | identyfikator_zmiennej |
zmienne typu | id | identyfikator_zmiennej |
java.lang.String | NSString*, | identyfikator_zmiennej |
java.lang.Number | NSNumber* | identyfikator_zmiennej |
java.lang.Cloneable | NSKopiowanie* | identyfikator_zmiennej |
foo.bar.Wyłącz | FooBarMumble* | identyfikator_zmiennej |
foo.bar.Mumber$Inner | FooBarMumble_Inner*, | identyfikator_zmiennej |
Metody
Istnieją 2 ważne sposoby metod stosowanych w celach C. Różnią się one składniowo, co pozwala umieszczać parametry między komponentami selektora metody. Metody celu C nie obsługują przeciążania, podobnie jak Java. Różnice te można rozwiązać, umieszczając typy parametrów w wygenerowanym selektorze. Jest to konieczne, aby uniknąć konfliktów nazw między przeciążonymi metodami Java.
Istnieją 3 typy metod Java, które różnią się w wygenerowanym interfejsie API: metody instancji, metody statyczne i konstruktory. Metody instancji są przekształcane w metody instancji celu C. Metody i konstruktory statyczne przekładają się na funkcje w stylu C, ale dodają też otoki Goal-C, aby umożliwić programistom korzystanie z bardziej znanego interfejsu API.
Metody instancji
Nazwy metod są generowane w ten sposób:
- Metody zerowy nie zmieniają się
- Co najmniej 1 parametr używa tego wzorca:
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- Reguły słów kluczowych dotyczące parametrów:
- W przypadku typów podstawowych słowo kluczowe jest pisane wielką literą w przypadku tych elementów. (np. „Char”)
- W przypadku innych typów słów kluczowych słowo to będzie pełne i jednoznaczne. (np. „ComGoogleFoo”).
- W przypadku typów tablic do słowa kluczowego typu elementu jest dołączana „tablica”.
Przykładowy Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Przykładowy cel C
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
Metody statyczne
Metoda klasy Goal-C jest dodawana zgodnie z tymi samymi regułami nazewnictwa co metody instancji.
Funkcja stylu C jest dodawana za pomocą następujących reguł nazewnictwa:
- Zacznij od wygenerowanego selektora celu C. (np.
barWithInt:
) - Zastąp dwukropki znakami podkreślenia. (np.
barWithInt_
) - Na początku nazwy zajęć umieść znak podkreślenia. (np.
ComGoogleFoo_barWithInt_
)
Przykładowy Java
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Przykładowy cel 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);
Zespoły
Zgodnie z konwencją cel-C została dodana metoda instancji init
. Jeśli konstruktor ma parametry, stosowana jest ta sama reguła nazewnictwa co metody instancji.
Dodaliśmy 3 funkcje stylu C:
- Pierwsza funkcja przyjmie jako nowo przydany nowo przypisany obiekt. Ta funkcja jest zwykle używana do wywoływania z konstruktora podklasy. Obowiązują te same reguły nazw co w przypadku metod statycznych. (gdzie „init” to nazwa metody)
- Dodaliśmy dwie funkcje, które przydzielą i zainicjują nowy obiekt. Można je rozpoznać po prefiksie:
- Funkcja
create_
zwróci automatycznie zwolniony obiekt. - Funkcja
new_
zwróci zwrócony obiekt.
- Funkcja
Przykładowy Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Przykładowy cel 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);
Pola
Pola instancji (nie statyczne)
Zmienne instancji Java staną się zmiennymi celu C. Nazwa jest taka sama jak na końcu. Pola podstawowe zadeklarowane jako „ostateczne” to specjalny przypadek i nie są one przekształcane na zmienne instancji.
- Dostęp do pól można uzyskać bezpośrednio przy użyciu składni „->”.
- Pola podstawowe można ustawić bezpośrednio.
- Końcówki podstawowe (stałe) są przekształcane w stałe statyczne. (zobacz Pola statyczne).
- Pola inne niż podstawowe muszą być ustawione za pomocą udostępnionej funkcji ustawiania:
ClassName_set_fieldName_(instance, value)
Przykładowy Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Przykładowy cel 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");
Pola statyczne
Dostęp do zmiennych statycznych należy uzyskiwać za pomocą dostępnych funkcji getter i seter. Dzięki tym funkcjom dostępu inicjacja klasy rozpoczęła się przed uzyskaniem dostępu do zmiennej.
- Otwórz pole statyczne
ClassName_get_fieldName()
- Przypisz (niefinalizowane) pole statyczne
ClassName_set_fieldName()
- Uzyskiwanie wskaźnika do podstawowego pola statycznego
ClassName_getRef_fieldName()
- Ta opcja jest dostępna tylko w przypadku pól niefinalnych i nieulotnych.
Końcowe pola podstawowe (stałe) są dostępne bezpośrednio, ponieważ ich wartość nie zależy od inicjowania klasy.
ClassName_fieldName
Przykładowy Java
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Przykładowy cel 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");
Wartości w polu enum
J2ObjC generuje 2 typy dla każdego wyliczenia Java. Wygenerowany jest typ klasy Goal-C, który zapewnia pełną funkcjonalność wyliczenia Java. Dodatkowo generowana jest en C C za pomocą makra NS_ENUM platformy Podstawy. Typ klasy Goal-C jest używany przez wszystkie wygenerowane interfejsy API. Wartość w polu C jest przydatna jako wartość stała dla instrukcji przełącznika lub typ pamięci masowej.
Wygenerowane typy wyliczenia mają te nazwy:
- Nazwa klasy celu C ma taką samą regułę jak zwykła klasa w języku Java. (zobacz Typy).
- Nazwa w formacie c jest przypisana do zwykłej klasy Java z dodanym sufiksem „_Enum”.
Stałe liczby cząstkowej są dostępne tak jak pola statyczne.
Przykładowy Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Przykładowy nagłówek Goal-C
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);