Как указать префиксы для имен пакетов.

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

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.