Справочник по переводу

Типы

  • Для примитивных типов J2ObjC определил определения типов в стиле JNI.
  • Для типичных типов классов пакет имеет верблюжий регистр и добавляется к имени класса.
  • Для базового типа объекта и всех переменных типа используется «id».
  • Несколько основных типов Java сопоставлены с базовыми типами. (например, строка в NSString)
  • Для полей, объявленных «изменчивыми», J2ObjC имеет больше определений типов, которые используют типы C11 _Atomic(...).
  • Для внутренних типов имя внутреннего класса добавляется к внешнему имени с помощью подчеркивания.
Тип Java Тип цели-C Независимый тип Objective-C
логическое значение jboolean Летучий_jboolean
голец Джчар Летучий_jchar
байт jbyte Летучий_jbyte
короткий jshort Летучий_jshort
интервал шутка летучий_джинт
длинный Джлонг Летучий_jlong
плавать jfloat летучий_jfloat
двойной jdouble летучий_jdouble
java.lang.Объект идентификатор Летучий_ид
тип переменных идентификатор Летучий_ид
java.lang.String NSString* Летучий_ид
java.lang.Номер НСНомер* Летучий_ид
java.lang.Cloneable НСКопирование* Летучий_ид
foo.bar.Mumble FooBarMumble* Летучий_ид
foo.bar.Mumber$Inner FooBarMumble_Inner* Летучий_ид

Методы

Методы Objective-C отличаются от методов Java двумя важными моментами. Они синтаксически различны: параметры встраиваются между компонентами селектора метода. Методы Objective-C не поддерживают перегрузку, как это делает Java. Эти различия устраняются путем внедрения типов параметров в сгенерированный селектор. Это необходимо для предотвращения конфликтов имен между перегруженными методами Java.

Существует три типа методов Java, которые различаются созданным API: методы экземпляра, статические методы и конструкторы. Методы экземпляра преобразуются в методы экземпляра Objective-C. Статические методы и конструкторы преобразуются в функции в стиле C, а также добавляют оболочки Objective-C, чтобы предоставить разработчикам Objective-C более знакомый API.

Методы экземпляра

Имена методов генерируются следующим образом:

  • Методы с нулевым параметром не изменились.
  • Один или несколько параметров используют следующий шаблон:
    • <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);
}
Пример 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);

Конструкторы

В соответствии с соглашением Objective-C добавляется метод экземпляра init . Если у конструктора есть параметры, используется то же правило именования, что и для методов экземпляра.

Добавлены три функции в стиле C:

  • Первая функция принимает вновь выделенный объект в качестве своего первого параметра. Эта функция обычно используется для вызова из конструктора подкласса. Это следует тем же правилам именования, что и статические методы. (где «init» — имя метода)
  • Добавляются две функции, которые будут выделять и инициализировать новый объект. Они отличаются префиксом:
    • Функция 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");

Статические поля

Доступ к статическим переменным должен осуществляться с использованием предусмотренных функций получения и установки. Эти функции доступа гарантируют, что инициализация класса произошла до доступа к переменной.

  • Доступ к статическому полю
    • 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");

Перечисления

J2ObjC генерирует два типа для каждого перечисления Java. Создается тип класса Objective-C, который обеспечивает полную функциональность перечисления Java. Кроме того, перечисление C генерируется с использованием макроса NS_ENUM платформы Foundation. Тип класса Objective-C используется всеми созданными API. Перечисление C полезно в качестве константных значений для оператора переключения или в качестве типа хранения.

Сгенерированные типы перечислений называются следующим образом:

  • Класс Objective-C именуется по тому же правилу, что и обычный класс Java. (см. Типы )
  • Перечисление C названо как обычный класс Java с добавленным суффиксом «_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);