Чтение сгенерированных исходников

Сопоставление имен классов

Поскольку J2ObjC переводит только классы Java, не относящиеся к пользовательскому интерфейсу, приложение iOS должно напрямую работать с переведенными классами. Переведенные классы — это обычные классы Objective-C с корнем NSObject, но они помогают понять, как преобразуются имена классов, методов, параметров и файлов заголовков.

Java использует пакеты для определения пространств имен, в то время как Objective-C не имеет пакетов и вместо этого имеет соглашение о размещении общего префикса перед связанными классами (например, NSObject и NSString). Чтобы сохранить пространство имен Java, имена пакетов сопоставляются с префиксом в верблюжьем стиле. Например, java.util.List по умолчанию сопоставляется с JavaUtilList . Этот префикс по умолчанию можно явно установить с помощью параметров префикса пакета j2objc.

Имена параметров

Java различает перегруженные методы по типам аргументов, а Objective-C использует имена аргументов. Таким образом, J2ObjC создает имена аргументов из их типов. Например, вот как объект вставляется в начало ArrayList и как этот список затем добавляется в другой список:

[someList addWithInt:0 withId:object];
[otherList addAllWithJavaUtilCollection:somelist];

Имя каждого аргумента состоит из слова «with» и его типа. Это немного некрасиво, но гарантирует, что в Objective-C всегда будет вызываться тот же метод, что и в Java.

Имена заголовков

Однако имена заголовочных файлов не отображаются, а вместо этого путь к исходному файлу Java заканчивается на «.h» вместо «.java». Это значительно упрощает поддержку таких инструментов, как Xcode и Make, но поначалу может немного сбивать с толку, поскольку:

#import "java/util/Date.h"

объявляет класс JavaUtilDate , а не Date .

Использование переведенных классов

За исключением нечетных имен (которые можно упростить с помощью префиксов пакетов ), переведенные классы используются так же, как и любой другой класс Objective-C:

#import "java/util/BitSet.h"
...
  JavaUtilBitSet *bitset = [[JavaUtilBitSet alloc] init];
  [bitset setWithInt:10 withBOOL:YES];
  BOOL b = [bitset getWithInt:10];