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

ประเภท

  • สําหรับประเภทพื้นฐาน J2ObjC ได้ให้คําจํากัดความประเภทของ JNI ไว้
  • สําหรับประเภทชั้นเรียนทั่วไป พัสดุจะบรรจุอูฐไว้ด้านหน้าและเพิ่มไปยังชื่อชั้นเรียน
  • สําหรับประเภทออบเจ็กต์ฐานและตัวแปรทุกประเภท ระบบจะใช้ "id"
  • ระบบจะแมป Java ประเภทหลักบางประเภทกับประเภทราก (เช่น String to NSString)
  • สําหรับช่องที่ประกาศเป็น "ผันผวน" J2ObjC มีประเภทการป้องกันที่ใช้ประเภท C11 _Atomic(...) มากกว่า
  • สําหรับประเภทภายใน ชื่อคลาสภายในจะต่อท้ายชื่อภายนอกด้วยเครื่องหมายขีดล่าง
ประเภท Java ประเภท Objective-C ประเภทความผันผวนของวัตถุ C
บูลีน บูลีน volatile_jบูลีน
อักขระ Jchar ผันผวน
ไบต์ ไบต์ ความผันผวนของปริมาณ
วิดีโอสั้น Shorts ผันผวน
int Jint ผันผวน
long Jlong ผันผวน
จำนวนลอยตัว ลอย ลอยตัวผันผวน
คู่ Jdouble ผันผวน
java.lang.Object รหัส รหัสผันผวน
ตัวแปรประเภท รหัส รหัสผันผวน
java.lang.String NSString* รหัสผันผวน
java.lang.Number NSNumber* รหัสผันผวน
java.lang.Cloneable การคัดลอก NS* รหัสผันผวน
foo.bar.Mumble FooBarMumble* รหัสผันผวน
foo.bar.Mumber$Inner FooBarMumble_Inner* รหัสผันผวน

วิธีการ

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

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

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

ชื่อวิธีการมีดังนี้

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

ผู้ผลิต

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

โดยจะเพิ่มฟังก์ชันสไตล์ C 3 อย่าง ได้แก่

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

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

ประเภท Enum ที่สร้างขึ้นมีดังต่อไปนี้

  • คลาส Objective-C ตั้งชื่อโดยใช้กฎเดียวกับคลาส Java ปกติ (ดูประเภท)
  • ชื่อ E

คุณจะเข้าถึงค่าคงที่ของ 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);