תרגום

סוגים

  • עבור סוגים מהדור הישן, J2ObjC הגדיר Jdefdef-style של JNI.
  • בסוגים אופייניים של מארז, החבילה ארוזה בגמלים לפני השם של הכיתה.
  • נעשה שימוש בערך "id" לסוג אובייקט הבסיס ולכל משתני הסוג.
  • יש כמה סוגי ליבה של Java שממופים לסוגי יסוד. (למשל מחרוזת ל-NSString)
  • בשדות שהצהרתם עליהם שהם 'תנודתיים', ל-J2ObjC יש יותר התאמות typetypes שמשתמשות בסוגי C11 _Atomic......).
  • עבור סוגים פנימיים, השם של המחלקה הפנימית מצורף לשם החיצוני עם קו תחתון.
סוג Java סוג המטרה C יעד תנודתי של C-C
boolean Jboolean תנודתי_ג'וליאני
char, תו jchar, ג'קאר jonvolile_jchar
בייט jbyte volatile_jbyte
סרטון קצר jshort volatile_jshort
int Jint נגינת גליל
long Jlong תנודתי_Jlong
מספר ממשי (float) jfloat, יפן volatil_jfloat
כפולה Jdouble תנודתיות
java.lang.Object id מזהה תנודתי
משתני סוג id מזהה תנודתי
java.lang.String NSString* מזהה תנודתי
java.lang.Number NSNumber* מזהה תנודתי
java.lang.Cloneable NSהעתקה* מזהה תנודתי
foo.bar.Mumble PubBarMumble* מזהה תנודתי
foo.bar.Mumber$Inner fooBarMumble_Inner* מזהה תנודתי

שיטות

שיטות המטרה-C שונות משיטות ה-Java בשתי דרכים חשובות. הם שונים מבחינה תחבירית, ומטמיעים את הפרמטרים בין הרכיבים של בורר השיטות. שיטות המטרה-C לא תומכות בעומס יתר כמו ב-Java. ניתן לפתור את ההבדלים האלה על ידי הטמעת סוגי הפרמטרים בבורר שנוצר. פעולה זו הכרחית כדי למנוע התנגשויות בין שמות של שיטות Java עמוסות.

יש שלושה סוגים של שיטות Java השונות בממשק ה-API שנוצר: שיטות מופע, שיטות סטטיות ובנאים. שיטות המופע מתורגמות לשיטות מופע של המטרה-C. שיטות סטטיות ובוני אתרים מתורגמים לפונקציות בסגנון C, אבל מוסיפים גם רכיבי wrapper של מטרה-ג'י כדי לספק למפתחי API ממשק API מוכר יותר.

שיטות המופע

שמות השיטות נוצרים באופן הבא:

  • שיטות של אפס פרמטרים לא השתנו
  • פרמטר אחד או יותר משתמשים בתבנית הבאה:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • פרמטרים של מילות מפתח:
    • עבור סוגים מהדור הישן, מילת המפתח היא השם באותיות רישיות של האלמנט הפשוט Java. (למשל "Char")
    • בסוגים לא-פרימיטיביים, מילת המפתח היא שם מלא ומתאים באותיות רישיות. (למשל "ComGooglePub"
    • עבור סוגי מערכים, "Aray" מצורף למילת המפתח של סוג הרכיב.
דוגמה ל-Java
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
יעד לדוגמה ג'
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

שיטות סטטיות

השיטה 'מחלקה C' אובייקטיבית מתווספת לפי אותם כללים למתן שמות כמו שיטות המכונה.

נוספת פונקציה בסגנון C באמצעות הכללים הבאים למתן שמות:

  • מתחילים עם בורר האובייקט C-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) { ... }
}
יעד לדוגמה ג'
@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);

יצרנים

לפי המוסכמות של יעד C, מתווספת שיטת מופע init. אם לבנאי יש פרמטרים, המערכת משתמשת באותו כלל למתן שמות כמו זה של המכונה.

נוספו שלוש פונקציות בסגנון C:

  • הפונקציה הראשונה מקבלת את האובייקט החדש שהוקצה כפרמטר הראשון שלה. בדרך כלל משתמשים בפונקציה הזו כדי לקרוא לבנייה משנית. הכללים האלה מבוססים על אותם כללים למתן שמות כמו שיטות סטטיות. (כאשר "itit" הוא שם השיטה)
  • נוספו שתי פונקציות שיוקצו ויאתחלו את האובייקט החדש. מה שמבדיל ביניהן הוא הקידומת שלהן:
    • הפונקציה create_ תחזיר אובייקט שהוסר אוטומטית.
    • הפונקציה new_ תחזיר אובייקט שנשמר.
דוגמה ל-Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
יעד לדוגמה ג'
@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 הופכים למשתני מופע של המטרה-C. השם זהה עם קו תחתון עוקב. שדות פרימיטיביים המוצהרים כ"סופיים" הם מקרים מיוחדים ואינם מתורגמים למשתני מופע.

  • ניתן לגשת לשדות ישירות באמצעות התחביר "->".
  • ניתן להגדיר שדות פשוטים באופן ישיר.
    • הקצוות הסופיים (קבועים) מתורגמים כמו קבועים קבועים. (עיינו בשדות סטטיים)
  • יש להגדיר שדות לא פשוטים באמצעות פונקציית המגדיר שסופקה:
    • ClassName_set_fieldName_(instance, value)
דוגמה ל-Java
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
יעד לדוגמה ג'
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 ו-Sett שסופקו. פונקציות הגישה האלה מבטיחות אתחול של מחלקה לפני הגישה למשתנה.

  • גישה לשדה סטטי
    • 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;
}
יעד לדוגמה ג'
// 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");

Enums

J2ObjC יוצר שני סוגים לכל טיפוס enum. סוג כיתה של מטרה-C נוצר, שמספק את הפונקציונליות המלאה של אנום של Java. כמו כן, נוצרת אנום מסוג C באמצעות מאקרו NS_ENUM של מסגרת הבסיס. כל סיווג שנוצר נעשה על ידי הסוג של Class-C. ה- Cenum שימושי בתור ערכים קבועים עבור הצהרת מעבר, או כסוג אחסון.

סוגי ה-enum שנוצרו נקראים כך:

  • שם הסיווג של ה-Object-C נקבע באמצעות אותו הכלל שמופיע במחלקת Java רגילה. (סוגים)
  • שם ה-C enum נקרא כשכבה רגילה של Java עם הסיומת '_Enum' נוספת.

הגישה אל קבועים של Enum היא כמו שדות סטטיים.

דוגמה ל-Java
package com.google;
enum Color {
  RED, GREEN, BLUE
}
דוגמה לכותרת של יעד 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);