Loại
- Đối với các kiểu dữ liệu nguyên thuỷ, J2ObjC đã xác định các kiểu dữ liệu kiểu JNI.
- Đối với các loại lớp thông thường, gói được viết hoa kiểu lạc đà và được thêm vào trước tên lớp.
- Để đổi tên tiền tố gói đã tạo, hãy xem phần Tiền tố gói.
- Đối với loại Đối tượng cơ sở và tất cả biến kiểu, "id" sẽ được sử dụng.
- Một vài loại Java cốt lõi được liên kết với các loại nền tảng. (ví dụ: Chuỗi đến NSString)
- Đối với các trường được khai báo là "volatile", J2ObjC có nhiều typedef hơn sử dụng các loại C11 _Atomic(...).
- Đối với các kiểu bên trong, tên lớp bên trong sẽ được nối thêm vào tên ngoài bằng dấu gạch dưới.
Loại Java | Loại mục tiêu-C | Loại biến động Mục tiêu-C |
---|---|---|
boolean | jboolean | volatile_jboolean |
ký tự | jchar | volatile_jchar |
byte | jbyte | volatile_jbyte |
ngắn | quần ngắn | volatile_jshort |
int | giáng sinh | volatile_jint |
long | jlong | volatile_jlong |
số thực dấu phẩy động | dấu phẩy động | volatile_jfloat |
gấp đôi | thao tác đánh đôi | volatile_jdouble |
java.lang.Object | id | volatile_id |
biến kiểu dữ liệu | id | volatile_id |
java.lang.String | NSString* | volatile_id |
java.lang.Number | Số NS* | volatile_id |
java.lang.Cloneable | Sao chép nội dung trên trang web của bạn* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
Phương thức
Các phương thức object-C khác với các phương thức Java ở hai điểm quan trọng. Chúng có cú pháp nhúng các tham số vào giữa các thành phần của bộ chọn phương thức. Mục tiêu C không hỗ trợ nạp chồng như Java. Những khác biệt này được giải quyết bằng cách nhúng vào bộ chọn đã tạo. Điều này là cần thiết để ngăn chặn xung đột tên giữa quá tải phương thức Java.
Có 3 loại phương thức Java khác nhau trong API đã tạo: phương thức thực thể, phương thức tĩnh phương thức và hàm khởi tạo. Các phương thức thực thể sẽ chuyển thành phương thức thực thể Mục tiêu-C. Tĩnh các phương thức và hàm khởi tạo chuyển thành hàm kiểu C, nhưng cũng thêm trình bao bọc Target-C vào cung cấp một API quen thuộc hơn cho nhà phát triển Target-C.
Phương thức thực thể
Tên phương thức được tạo như sau:
- Các phương thức không có tham số không thay đổi
- Một hoặc nhiều tham số sử dụng mẫu sau:
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- Các quy tắc về từ khoá thông số:
- Đối với các loại dữ liệu nguyên gốc, từ khoá là tên viết hoa của kiểu dữ liệu gốc Java. (ví dụ: "Ký tự")
- Đối với các loại không phải từ đầu, từ khóa là tên loại đủ điều kiện được viết hoa kiểu lạc đà. (ví dụ: "ComGoogleFoo")
- Đối với các loại mảng, "Mảng" được thêm vào từ khoá của loại phần tử.
Ví dụ về Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Ví dụ về mục tiêu-C
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
Phương thức tĩnh
Phương thức lớp Target-C được thêm theo các quy tắc đặt tên tương tự như phương thức thực thể.
Hàm kiểu C được thêm bằng các quy tắc đặt tên sau đây:
- Bắt đầu với bộ chọn Mục tiêu-C đã tạo. (ví dụ:
barWithInt:
) - Thay thế dấu hai chấm bằng dấu gạch dưới. (ví dụ:
barWithInt_
) - Thêm vào trước tên lớp (phân tách bằng dấu gạch dưới). (ví dụ:
ComGoogleFoo_barWithInt_
)
Ví dụ về Java
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Ví dụ về mục tiêu-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);
Hàm khởi tạo
Theo quy ước Target-C, phương thức thực thể init
sẽ được thêm. Nếu hàm khởi tạo có
tham số, quy tắc đặt tên giống như phương thức thực thể sẽ được sử dụng.
Thêm 3 hàm kiểu C:
- Hàm đầu tiên chấp nhận một đối tượng mới được phân bổ làm thông số đầu tiên. Chức năng này thường được dùng để gọi từ hàm khởi tạo lớp con. Điều này tuân theo các quy tắc đặt tên giống như quy tắc đặt giá thầu tĩnh . (trong đó "init" là tên phương thức)
- 2 hàm được thêm vào sẽ phân bổ và khởi tạo đối tượng mới. Chúng được phân biệt
theo tiền tố:
- Hàm
create_
sẽ trả về một đối tượng được tự động phát hành. - Hàm
new_
sẽ trả về một đối tượng được giữ lại.
- Hàm
Ví dụ về Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Ví dụ về mục tiêu-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);
Trường
Trường thực thể (không tĩnh)
Các biến thực thể Java sẽ trở thành biến thực thể Target-C. Tên này giống với một dấu kéo dấu gạch dưới. Các trường gốc được khai báo là "chính thức" là một trường hợp đặc biệt và không được dịch sang phiên bản biến.
- Bạn có thể truy cập trực tiếp vào các trường bằng cách dùng dấu "->" của bạn.
- Bạn có thể thiết lập trực tiếp các trường gốc.
- Các dữ liệu gốc cuối cùng (hằng số) được dịch như các hằng số tĩnh. (xem Trường tĩnh)
- Bạn phải thiết lập các trường không phải gốc bằng hàm setter đã cung cấp:
ClassName_set_fieldName_(instance, value)
Ví dụ về Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Ví dụ về mục tiêu-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");
Trường tĩnh
Biến tĩnh phải được truy cập bằng các hàm getter và setter đã cung cấp. Các hàm truy cập này đảm bảo rằng quá trình khởi tạo lớp đã xảy ra trước khi truy cập vào biến.
- Truy cập vào một trường tĩnh
ClassName_get_fieldName()
- Chỉ định một trường tĩnh (không phải cuối cùng)
ClassName_set_fieldName()
- Lấy con trỏ đến một trường tĩnh gốc
ClassName_getRef_fieldName()
- Chỉ dành cho các trường không phải cuối cùng và không biến động.
Các trường nguyên gốc cuối cùng (hằng số) an toàn để truy cập trực tiếp vì giá trị của các trường đó không phụ thuộc vào hoạt động khởi tạo lớp.
ClassName_fieldName
Ví dụ về Java
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Ví dụ về mục tiêu-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 tạo hai loại cho mỗi enum Java. Một loại lớp Mục tiêu-C được tạo để cung cấp toàn bộ chức năng của một enum Java. Ngoài ra, một enum C được tạo bằng Foundation NS_ENUM của khung. Tất cả API đã tạo đều sử dụng loại lớp Mục tiêu-C. Enum C là hữu ích làm giá trị hằng số cho một câu lệnh chuyển đổi hoặc dùng làm loại hình lưu trữ.
Các loại enum đã tạo có tên như sau:
- Lớp GOAL-C được đặt tên theo quy tắc tương tự như lớp Java thông thường. (xem phần Loại)
- Enum C được đặt tên là một lớp Java thông thường có thêm "_Enum" hậu tố.
Hằng số enum được truy cập như các trường tĩnh.
Ví dụ về Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Ví dụ về tiêu đề GOAL-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);