Referensi Terjemahan

Jenis

  • Untuk jenis primitif, J2ObjC telah mendefinisikan typedef gaya JNI.
  • Untuk jenis class standar, paket ini diberi camel case dan ditambahkan ke nama class.
    • Untuk mengganti nama awalan paket yang dihasilkan, lihat Awalan Paket.
  • Untuk jenis Objek dasar dan semua variabel jenis, "id" digunakan.
  • Beberapa jenis Java inti dipetakan ke jenis dasar. (misalnya, String ke NSString)
  • Untuk kolom yang dideklarasikan 'volatil', J2ObjC memiliki lebih banyak typedef yang menggunakan jenis C11 _Atomic(...).
  • Untuk jenis bagian dalam, nama class dalam ditambahkan ke nama luar dengan garis bawah.
Jenis Java Jenis Objective-C Jenis volatil Objective-C
boolean jboolean volatil_jboolean
karakter Jchar volatil_jchar
byte jbyte volatil_jbyte
video singkat jshort tidak stabil_jshort
int jin volatil_jint
long Jlong tidak stabil_jlong
float Jfloat volatil_jfloat
dobel Jdouble volatil_jdouble
java.lang.Objek id volatil_id
variabel jenis id volatil_id
String java.lang. NSString* volatil_id
Nomor.java.lang. NomorNS* volatil_id
java.lang.Cloneable Penyalinan* volatil_id
foo.bar.Rumit FooBarMumble* volatil_id
foo.bar.Mumber$Dalam FooBarMumble_Inner* volatil_id

Metode

Metode Objective-C berbeda dengan metode Java dalam dua hal penting. Secara sintaksis berbeda, parameter tersebut disematkan di antara komponen pemilih metode. Metode Objective-C tidak mendukung overload seperti Java. Perbedaan ini diselesaikan dengan menyematkan jenis parameter ke pemilih yang dihasilkan. Hal ini diperlukan untuk mencegah konflik nama antara metode Java yang kelebihan beban.

Ada tiga jenis metode Java yang berbeda dalam API yang dihasilkan: metode instance, metode statis, dan konstruktor. Metode instance diterjemahkan menjadi metode instance Objective-C. Metode dan konstruktor statis diterjemahkan menjadi fungsi bergaya C, tetapi juga menambahkan wrapper Objective-C untuk menyediakan API yang lebih dikenal bagi developer Objective-C.

Metode Instance

Nama metode dibuat sebagai berikut:

  • Metode parameter nol tidak berubah
  • Satu atau beberapa parameter menggunakan pola berikut:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • Aturan kata kunci parameter:
    • Untuk jenis primitif, kata kunci adalah nama yang menggunakan huruf besar dari primitif Java. (misalnya, "Karakter")
    • Untuk jenis non-primitif, kata kuncinya adalah nama jenis yang sepenuhnya memenuhi syarat untuk unta. (misalnya, "ComGoogleFoo")
    • Untuk jenis array, "Array" ditambahkan ke kata kunci jenis elemen.
Contoh Java
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Contoh Objective-C
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

Metode Statis

Metode class Objective-C ditambahkan dengan mengikuti aturan penamaan yang sama dengan metode instance.

Fungsi bergaya C ditambahkan menggunakan aturan penamaan berikut:

  • Mulai dengan pemilih Objective-C yang dihasilkan. (misalnya, barWithInt:)
  • Ganti titik dua dengan garis bawah. (misalnya, barWithInt_)
  • Awali nama class, dipisahkan dengan garis bawah. (misalnya, ComGoogleFoo_barWithInt_)
Contoh Java
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Contoh 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);

Konstruktor

Setelah konvensi Objective-C, metode instance init ditambahkan. Jika konstruktor memiliki parameter, aturan penamaan yang sama dengan metode instance akan digunakan.

Tiga fungsi bergaya C ditambahkan:

  • Fungsi pertama menerima objek yang baru dialokasikan sebagai parameter pertamanya. Fungsi ini biasanya digunakan untuk memanggil dari konstruktor subclass. Aturan ini mengikuti aturan penamaan yang sama dengan metode statis. (dengan "init" adalah nama metode)
  • Dua fungsi ditambahkan untuk mengalokasikan dan menginisialisasi objek baru. Keduanya dibedakan dengan awalannya:
    • Fungsi create_ akan menampilkan objek yang dirilis secara otomatis.
    • Fungsi new_ akan menampilkan objek yang dipertahankan.
Contoh Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Contoh 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);

Kolom

Kolom Instance (non-statis)

Variabel instance Java menjadi variabel instance Objective-C. Namanya sama dengan garis bawah di akhir. Kolom primitif yang dideklarasikan "final" adalah kasus khusus dan tidak diterjemahkan ke variabel instance.

  • Kolom dapat diakses langsung menggunakan sintaksis "->".
  • Kolom primitif dapat ditetapkan secara langsung.
    • Primitif akhir (konstanta) diterjemahkan seperti konstanta statis. (lihat Kolom Statis)
  • Kolom non-primitif harus ditetapkan menggunakan fungsi penyetel yang disediakan:
    • ClassName_set_fieldName_(instance, value)
Contoh Java
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Contoh 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");

Kolom Statis

Variabel statis harus diakses menggunakan fungsi pengambil dan penyetel yang disediakan. Fungsi pengakses ini memastikan bahwa inisialisasi class telah dilakukan sebelum mengakses variabel.

  • Mengakses kolom statis
    • ClassName_get_fieldName()
  • Menetapkan kolom statis (non-final)
    • ClassName_set_fieldName()
  • Mendapatkan pointer ke kolom statis primitif
    • ClassName_getRef_fieldName()
    • Hanya tersedia untuk kolom non-final dan non-volatil.

Kolom primitif final (konstanta) aman diakses secara langsung karena nilainya tidak bergantung pada inisialisasi class.

  • ClassName_fieldName
Contoh Java
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Contoh 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");

Enumerasi

J2ObjC menghasilkan dua jenis untuk setiap enum Java. Jenis class Objective-C dibuat, yang menyediakan fungsi lengkap enum Java. Selain itu, enum C dibuat menggunakan makro NS_ENUM framework Foundation. Jenis class Objective-C digunakan oleh semua API yang dihasilkan. Enum C berguna sebagai nilai konstan untuk pernyataan tombol, atau sebagai jenis penyimpanan.

Jenis enum yang dihasilkan diberi nama sebagai berikut:

  • Class Objective-C diberi nama menggunakan aturan yang sama seperti class Java biasa. (lihat Jenis)
  • Enum C diberi nama sebagai class Java reguler dengan akhiran "_Enum" yang ditambahkan.

Konstanta enum diakses seperti kolom statis.

Contoh Java
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Contoh Header Objective-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);