Сопоставление имен
Java использует пакеты для неформального определения пространств имен; в то время как Objective C++ имеет пространства имен C++, Objective C — нет. Чтобы сохранить уникальность имени при использовании классов из нескольких пакетов, J2ObjC добавляет версию пакета в верблюжьем стиле к имени типа. Например, java.util.Map
переименовывается в JavaUtilMap
.
К сожалению, имена пакетов в верблюжьем регистре могут ухудшить читаемость сгенерированного кода, особенно с длинными именами пакетов. Например, аннотация бета-версии Google Guava находится в пакете com.google.common.annotations
, а ComGoogleCommonAnnotationsBeta
читать труднее, чем Beta
.
Определение префикса пакета
Соглашение Objective-C для определения неофициальных пространств имен заключается в использовании общего префикса, обычно двух заглавных букв. Например, iOS Foundation Framework использует «NS» (из NeXTStep ). Чтобы упростить имя бета-версии Google Guava, такой префикс, как «GG», улучшит читаемость, поскольку Beta
будет называться GGBeta
.
J2ObjC поддерживает разработчиков, указывающих свои собственные префиксы для сопоставления с именами пакетов. Это делается в командной строке с помощью --prefix package = prefix
. Чтобы сократить имена всех классов в Beta
-пакете, будет использоваться " --prefix com.google.common.annotations=GG
"". Для каждого пакета необходимо отдельное объявление префикса.
Определение одного префикса для нескольких пакетов
Небольшие библиотеки часто имеют имена классов Java, которые не конфликтуют и поэтому могут использовать один префикс со спецификацией пакета с подстановочными знаками. Например, все пакеты Joda-Time могут использовать один и тот же префикс JT , используя --prefix 'org.joda.time.*=JT'
. Единственный поддерживаемый подстановочный знак — это «*», который соответствует тому же принципу, который оболочка командной строки использует для имен файлов.
Определение нескольких префиксов пакета
Чтобы упростить указание нескольких определений префиксов, можно использовать файл свойств с аргументом « --prefixes
file »:
cat prefixes.properties
com.google.common.annotations: GG com.google.common.base: GG # While GG can be used for all packages, let's mix it up. com.google.common.collect: GC com.google.common.io: GIO # A prefix can be more than two characters, com.google.common.net: GuavaNet # a lot more! ...
j2objc --prefixes prefixes.properties <args>
Префиксные классы во время выполнения
Поскольку готовое приложение имеет классы с префиксами, их невозможно найти по исходному имени класса Java по умолчанию. Однако если в пакете ресурсов приложения есть файл с именем prefixes.properties с префиксами, используемыми для перевода, Class.forName(javaName)
найдет сопоставленный класс.
Чтобы добавить приведенные выше префиксы.properties в приложение iOS в Xcode, откройте вкладку «Фазы сборки» цели сборки, разверните раздел «Копировать ресурсы пакета» и добавьте файл prefixes.properties в этот список. Ресурсы Java содержат дополнительную информацию о том, как концепции ресурсов Java сопоставляются с ресурсами iOS.