Referensi Terjemahan

Jenis

  • Untuk jenis primitif, J2ObjC telah menentukan typedef bergaya JNI.
  • Untuk jenis class standar, paket menggunakan 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 sebagai 'volatil', J2ObjC memiliki lebih banyak typedef yang menggunakan jenis _Atomic(...) C11.
  • Untuk jenis dalam, nama class dalam ditambahkan ke nama bagian luar dengan garis bawah.
Jenis Java Jenis Objective-C Jenis volatil Objective-C
boolean jboolean volatile_jboolean
char Jchar volatile_jchar
byte {i>Jbyte<i} volatile_jbyte
short singkat volatile_jshort
int jin volatile_jint
long Jlong volatile_jlong
float {i>jfloat<i} volatile_jfloat
double {i>Jdouble<i} volatile_jdouble
java.lang.Object id volatile_id
variabel jenis id volatile_id
java.lang.String NSString* volatile_id
java.lang.Number Nomor NS* volatile_id
java.lang.Cloneable NSMenyalin* volatile_id
foo.bar.Mumble FooBarMumble* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

Metode

Metode Objective-C berbeda dengan metode Java dalam dua hal. Mereka secara sintaksis menyematkan parameter di antara komponen pemilih metode. Objective-C tidak mendukung kelebihan beban seperti yang dilakukan Java. Perbedaan ini diatasi dengan menyematkan jenis parameter ke dalam pemilih yang dibuat. Hal ini diperlukan untuk mencegah tumbukan nama antara metode Java yang berlebih.

Ada tiga jenis metode Java yang berbeda dalam API yang dihasilkan: metode instance, metode metode, dan konstruktor. Metode instance diterjemahkan ke dalam metode instance Objective-C. Statis metode dan konstruktor diubah menjadi fungsi gaya C, tetapi juga menambahkan wrapper Objective-C ke menyediakan API yang lebih familier 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 kuncinya adalah nama huruf besar dari primitif Java. (misalnya, "Karakter")
    • Untuk jenis non-primitif, kata kunci adalah nama jenis camel-case yang sepenuhnya memenuhi syarat. (misalnya, "ComGoogleFoo")
    • Untuk jenis array, "Array" ditambahkan ke kata kunci dari 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 seperti metode instance.

Fungsi gaya C ditambahkan menggunakan aturan penamaan berikut:

  • Mulai dengan pemilih Objective-C yang dihasilkan. (misalnya, barWithInt:)
  • Ganti titik dua dengan garis bawah. (misalnya, barWithInt_)
  • Tambahkan nama class di awal, yang 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 gaya C ditambahkan:

  • Fungsi pertama menerima objek yang baru dialokasikan sebagai parameter pertamanya. Fungsi ini adalah biasanya digunakan untuk memanggil dari konstruktor subclass. Nama ini mengikuti aturan penamaan yang sama dengan statis metode. (dengan "init" adalah nama metodenya)
  • Dua fungsi ditambahkan yang akan mengalokasikan dan menginisialisasi objek baru. Mereka dibedakan menurut awalannya:
    • Fungsi create_ akan menampilkan objek yang dirilis 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 garis bawah. Kolom primitif dinyatakan "final" merupakan kasus khusus dan tidak diterjemahkan ke dalam variabel.

  • 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");

Bidang Statis

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

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

Kolom primitif akhir (konstanta) aman untuk 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");

Enum

J2ObjC menghasilkan dua jenis untuk setiap enum Java. Jenis kelas Objective-C dibuat yang menyediakan fungsionalitas penuh enum Java. Selain itu, enum C dibuat menggunakan makro NS_ENUM framework. Jenis class Objective-C digunakan oleh semua API yang dihasilkan. Enum C adalah berguna sebagai nilai konstanta untuk pernyataan switch, atau sebagai tipe penyimpanan.

Jenis enum yang dihasilkan diberi nama sebagai berikut:

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

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