ประเภท
- สำหรับประเภทดั้งเดิม 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);