Tài liệu tham khảo về bản dịch

Loại

  • Đối với các kiểu dữ liệu gốc, J2ObjC đã xác định kiểu dữ liệu kiểu JNI.
  • Đối với các loại lớp thông thường, gói này được viết hoa Camel và 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ả các biến loại, "id" đượ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 thành NSString)
  • Đối với các trường được khai báo là "volatile", J2ObjC có nhiều typedef sử dụng loại C11 _Atomic(...).
  • Đối với các loại bên trong, tên lớp bên trong được thêm vào tên bên ngoài bằng dấu gạch dưới.
Loại Java Loại Objective-C Loại biến động Objective-C
boolean jboolean (logic) volatile_jboolean
ký tự jchar volatile_jchar
byte jbyte volatile_jbyte
ngắn quần đùi volatile_jshort
int CANNOT TRANSLATE volatile_jint
dài kinh giới volatile_jlong
số thực dấu phẩy động giật volatile_jfloat
gấp đôi nối đôi volatile_jdouble
java.lang.Object id volatile_id
loại biến id volatile_id
java.lang.String NSString* (NSNS) volatile_id
java.lang.Số Số NS* volatile_id
java.lang.Cloneable Sao chép NS* volatile_id
foo.bar.Mumble Tài khoản thanh toán* volatile_id
foo.bar.Mumber$Bên trong FooBarMumble_Inside* volatile_id

Phương pháp

Phương thức Objective-C khác với các phương thức Java theo hai cách quan trọng. Chúng có cú pháp khác nhau, nhúng các tham số ở giữa các thành phần của bộ chọn phương thức. Phương thức Objective-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 các loại thông số vào bộ chọn đã tạo. Điều này cần thiết để ngăn xung đột tên giữa các phương thức Java quá tải.

Có 3 loại phương thức Java khác nhau trong API được tạo: phương thức thực thể, phương thức tĩnh và hàm khởi tạo. Các phương thức thực thể chuyển thành phương thức thực thể Objective-C. Các phương thức và hàm dựng tĩnh sẽ chuyển đổi thành các hàm kiểu C, nhưng cũng thêm trình bao bọc Objective-C để cung cấp một API quen thuộc hơn cho nhà phát triển Objective-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 0 không thay đổi
  • Một hoặc nhiều thông số sử dụng mẫu sau:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • Quy tắc từ khoá tham số:
    • Đối với các loại dữ liệu gốc, từ khóa là tên viết hoa của dữ liệu gốc Java. (ví dụ: "Ký tự")
    • Đối với các loại dữ liệu không phải là dữ liệu gốc, từ khóa là tên loại đủ điều kiện hoàn toàn theo quy ước lạc đà. (ví dụ: "ComGoogleFoo")
    • Đối với các loại mảng, "Array" được thêm vào từ khóa 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);
}
Mục tiêu ví dụ-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 Objective-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:

  • Bắt đầu bằng bộ chọn Objective-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 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) { ... }
}
Mục tiêu ví dụ-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 Objective-C, phương thức thực thể init sẽ được thêm vào. Nếu hàm khởi tạo có các tham số, thì quy tắc đặt tên tương tự 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. Hàm này thường dùng để gọi từ mộ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ư các phương thức tĩnh. (trong đó "init" là tên phương thức)
  • Hai hàm được thêm vào sẽ phân bổ và khởi tạo đối tượng mới. Họ được phân biệt theo tiền tố:
    • Hàm create_ sẽ trả về một đối tượng được tự động giải phóng.
    • Hàm new_ sẽ trả về một đối tượng được giữ lại.
Ví dụ về Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Mục tiêu ví dụ-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);

Các trường

Trường thực thể (không tĩnh)

Biến thực thể Java trở thành biến thực thể Objective-C. Tên giống với dấu gạch dưới ở cuối. Các trường nguyên bản được khai báo là "cuối cùng" là một trường hợp đặc biệt và không được dịch sang các biến thể hiện.

  • Bạn có thể truy cập trực tiếp vào các trường bằng cú pháp "->".
  • Bạn có thể đặt trực tiếp các trường chính.
    • Các dữ liệu gốc (hằng số) được dịch như hằng số tĩnh. (xem Các trường tĩnh)
  • Bạn phải thiết lập các trường không có bản quyền bằng cách sử dụ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;
}
Mục tiêu ví dụ-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

Bạn phải truy cập vào các biến tĩnh bằng các hàm getter và setter đã cung cấp. Các hàm truy cập này đảm bảo việc khởi tạo lớp đã xảy ra trước khi truy cập biến.

  • Truy cập vào 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ỏ trỏ đến một trường tĩnh nguyên 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 dữ liệu gốc (hằng số) cuối cùng có thể truy cập an toàn vì giá trị của các trường này không phụ thuộc vào quá trình 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;
}
Mục tiêu ví dụ-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. Loại lớp Objective-C được tạo ra, cung cấp chức năng đầy đủ của một enum Java. Ngoài ra, một enum C được tạo bằng macro NS_ENUM của khung. Loại lớp Objective-C được tất cả các API đã tạo sử dụng. Enum C hữu ích dưới dạng các giá trị hằng số cho câu lệnh chuyển đổi hoặc dưới dạng loại bộ nhớ.

Các loại enum đã tạo được đặt tên như sau:

  • Lớp Objective-C được đặt tên theo quy tắc giống như lớp Java thông thường. (xem Loại)
  • Enum C được đặt tên là một lớp Java thông thường có thêm hậu tố "_Enum".

Các hằng 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 đề 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);