ประเภท
- สําหรับประเภทพื้นฐาน 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);