ข้อมูลอ้างอิงในการแปล

ประเภท

  • สำหรับประเภทดั้งเดิม J2ObjC ได้กำหนด typedef รูปแบบ JNI
  • สำหรับประเภทคลาสทั่วไป แพ็กเกจจะเป็นหุ้มอูฐและขึ้นต้นด้วยชื่อคลาส
  • สำหรับประเภทออบเจ็กต์ฐานและตัวแปรทุกประเภทจะเป็น "id"
  • Java ประเภทหลัก 2-3 ประเภทจะแมปกับประเภทพื้นฐาน (เช่น สตริงเป็น NSString)
  • สำหรับช่องที่แจ้งว่า "ผันผวน" J2ObjC มี typedef มากกว่าที่ใช้ประเภท C11 _Atomic(...)
  • สำหรับประเภทภายใน ชื่อคลาสภายในจะต่อท้ายชื่อด้านนอกด้วยเครื่องหมายขีดล่าง
ประเภท Java ประเภท Objective-C ประเภทที่มีความผันผวน Objective-C
boolean Jboolean volatile_jboolean
อักขระ Jchar volatile_jchar
ไบต์ Jไบต์ volatile_jbyte
วิดีโอสั้น Jshort volatile_jshort
int Jint volatile_jint
ยาว Jlong volatile_jlong
จำนวนลอยตัว JFlo volatile_jfloat
double Jdouble volatile_jdouble
java.lang.Object id volatile_id
ตัวแปรประเภท id volatile_id
java.lang.String NSString* volatile_id
java.lang.Number หมายเลข NS* volatile_id
java.lang.Cloneable การคัดลอก NS* volatile_id
foo.bar.Mumble FooBarMumble* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

เมธอด

เมธอด Objective-C แตกต่างจากเมธอด Java ใน 2 เรื่องที่สําคัญ โดยใช้ไวยากรณ์ แตกต่าง โดยฝังพารามิเตอร์ระหว่างคอมโพเนนต์ของตัวเลือกเมธอด Objective-C จะไม่รองรับการโหลดมากเกินไปอย่างที่ Java รองรับ ความแตกต่างเหล่านี้แก้ไขได้ด้วยการฝัง ประเภทพารามิเตอร์ลงในตัวเลือกที่สร้างขึ้น ซึ่งเป็นสิ่งจำเป็นเพื่อป้องกันไม่ให้ชื่อขัดแย้งกัน เมธอด Java มากเกินไป

มีเมธอด Java 3 ประเภทที่แตกต่างกันใน API ที่สร้างขึ้น ได้แก่ เมธอดอินสแตนซ์ และเมธอดแบบคงที่ และวิธีการสร้าง ระบบจะแปลงเมธอดอินสแตนซ์เป็นเมธอดอินสแตนซ์ Objective-C คงที่ และเมธอดและเครื่องมือสร้างจะแปลงออกมาเป็นฟังก์ชันสไตล์ C แต่ยังเพิ่ม Objective-C Wrapper ลงใน ให้ API ที่คุ้นเคยมากขึ้นแก่นักพัฒนาซอฟต์แวร์ Objective-C

เมธอดของอินสแตนซ์

ระบบจะสร้างชื่อเมธอดดังนี้

  • ไม่มีการเปลี่ยนแปลงเมธอดพารามิเตอร์
  • พารามิเตอร์อย่างน้อยหนึ่งรายการใช้รูปแบบต่อไปนี้
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • กฎคีย์เวิร์ดพารามิเตอร์
    • สำหรับประเภทพื้นฐาน คีย์เวิร์ดคือชื่ออักษรตัวพิมพ์ใหญ่ของ Java Primitive (เช่น "Char")
    • สำหรับประเภทที่ไม่ใช่แบบพื้นฐาน คีย์เวิร์ดคือชื่อประเภทที่มีคุณสมบัติครบถ้วนสมบูรณ์แบบหุ้มด้วยอูฐ (เช่น "ComGoogleFoo")
    • สำหรับประเภทอาร์เรย์ "อาร์เรย์" ต่อท้ายคีย์เวิร์ดของประเภทองค์ประกอบนั้นๆ
ตัวอย่าง Java
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
ตัวอย่าง Objective-C
- (void)bar;

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

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

เมธอดแบบคงที่

มีการเพิ่มเมธอดคลาส Objective-C ตามกฎการตั้งชื่อเดียวกันกับเมธอดอินสแตนซ์

มีการเพิ่มฟังก์ชันรูปแบบ C โดยใช้กฎการตั้งชื่อต่อไปนี้

  • เริ่มต้นด้วยตัวเลือก Objective-C ที่สร้างขึ้น (เช่น barWithInt:)
  • แทนที่เครื่องหมายโคลอนด้วยขีดล่าง (เช่น barWithInt_)
  • แทรกชื่อชั้นเรียนไว้ด้านหน้าและคั่นด้วยขีดล่าง (เช่น ComGoogleFoo_barWithInt_)
ตัวอย่าง Java
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
ตัวอย่าง 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);

ผู้ผลิต

เราได้เพิ่มเมธอดอินสแตนซ์ init ตามข้อตกลง Objective-C ถ้าเครื่องมือสร้างมี ระบบจะใช้กฎการตั้งชื่อเดียวกันกับเมธอดอินสแตนซ์

เพิ่มฟังก์ชันรูปแบบ C 3 รายการดังนี้

  • ฟังก์ชันแรกจะยอมรับออบเจ็กต์ที่จัดสรรใหม่เป็นพารามิเตอร์แรก ฟังก์ชันนี้คือ ซึ่งมักใช้สำหรับการเรียกจากตัวสร้างคลาสย่อย ซึ่งเป็นไปตามกฎการตั้งชื่อแบบเดียวกันกับแบบคงที่ (โดยที่ "init" คือชื่อเมธอด)
  • มีการเพิ่มฟังก์ชัน 2 รายการที่จะจัดสรรและเริ่มต้นออบเจ็กต์ใหม่ มีความแตกต่างกัน โดยคำนำหน้าดังนี้
    • ฟังก์ชัน create_ จะแสดงผลออบเจ็กต์ที่ปล่อยอัตโนมัติ
    • ฟังก์ชัน new_ จะส่งกลับออบเจ็กต์ที่เก็บรักษาไว้
ตัวอย่าง Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
ตัวอย่าง 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);

ช่อง

ช่องอินสแตนซ์ (ไม่คงที่)

ตัวแปรอินสแตนซ์ Java จะกลายเป็นตัวแปรอินสแตนซ์ Objective-C ชื่อเหมือนกันโดยต่อท้าย ขีดล่าง ช่องพื้นฐานที่ประกาศเป็น "สุดท้าย" เป็นกรณีพิเศษและจะไม่ได้รับการแปลเป็นอินสแตนซ์ ตัวแปร

  • เข้าถึงช่องได้โดยตรงโดยใช้ "->" ไวยากรณ์
  • คุณสามารถตั้งค่าฟิลด์พื้นฐานโดยตรง
    • ค่าคงที่สุดท้าย (ค่าคงที่) จะได้รับการแปลเหมือนค่าคงที่คงที่ (ดูช่องแบบคงที่)
  • ต้องตั้งค่าช่องที่ไม่เป็นค่าพื้นฐานโดยใช้ฟังก์ชันตัวตั้งค่าที่ให้มา ดังนี้
    • ClassName_set_fieldName_(instance, value)
ตัวอย่าง Java
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
ตัวอย่าง 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");

ฟิลด์แบบคงที่

ต้องเข้าถึงตัวแปรแบบคงที่โดยใช้ฟังก์ชัน Getter และ Setter ที่ให้ไว้ ฟังก์ชันตัวเข้าถึงเหล่านี้ช่วยให้มั่นใจว่าการเริ่มต้นคลาสเกิดขึ้นก่อนที่จะเข้าถึงตัวแปร

  • เข้าถึงช่องแบบคงที่
    • ClassName_get_fieldName()
  • กำหนดฟิลด์แบบคงที่ (ไม่ใช่ขั้นสุดท้าย)
    • ClassName_set_fieldName()
  • รับตัวชี้ไปยังช่องคงที่แบบพื้นฐาน
    • ClassName_getRef_fieldName()
    • ใช้ได้กับช่องที่ไม่ใช่ช่องสุดท้ายและช่องที่ไม่มีความผันผวนเท่านั้น

ช่องพื้นฐานสุดท้าย (ค่าคงที่) เข้าถึงได้โดยตรงเนื่องจากค่าไม่ได้ขึ้นอยู่กับการเริ่มต้นคลาส

  • ClassName_fieldName
ตัวอย่าง Java
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
ตัวอย่าง 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 สร้าง 2 ประเภทสำหรับ Java enum แต่ละรายการ ระบบจะสร้างคลาสประเภท Objective-C ซึ่งจะมอบ ฟังก์ชันทั้งหมดของ Java enum นอกจากนี้ C enum จะสร้างขึ้นโดยใช้ Foundation มาโคร NS_ENUM ของเฟรมเวิร์ก API ที่สร้างขึ้นทั้งหมดจะใช้คลาสประเภท Objective-C C enum คือ มีประโยชน์เป็นค่าคงที่สำหรับคำสั่งสวิตช์หรือเป็นประเภทพื้นที่เก็บข้อมูล

ประเภท enum ที่สร้างขึ้นจะมีชื่อดังนี้

  • คลาส Objective-C ได้รับการตั้งชื่อโดยใช้กฎเดียวกันกับคลาส Java ปกติ (ดูประเภท)
  • C enum ได้รับการตั้งชื่อเป็นคลาส Java ปกติโดยมี "_Enum" เพิ่มเข้ามา คำลงท้าย

เข้าถึงค่าคงที่แบบ enum ได้เหมือนกับช่องคงที่

ตัวอย่าง Java
package com.google;
enum Color {
  RED, GREEN, BLUE
}
ตัวอย่างส่วนหัว 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);