Mappage des noms
Java utilise des packages pour définir de manière informelle des espaces de noms. tandis que Objective C++ possède des espaces de noms C++,
contrairement à l'objectif C. Pour préserver l'unicité des noms lors de l'utilisation de classes provenant de plusieurs packages,
J2ObjC ajoute une version du package en Camel Case ("casse de chameau") au nom du type. Par exemple :
Changement de nom : java.util.Map
devient JavaUtilMap
.
Malheureusement, les noms de package en Camel Case ("casse de chameau") peuvent réduire la lisibilité du code généré, surtout
avec de longs noms de packages. Par exemple,
Annotation bêta
se trouve dans le package com.google.common.annotations
, et ComGoogleCommonAnnotationsBeta
est plus difficile à
lire que Beta
.
Définir un préfixe de package
La convention Objective-C pour définir des espaces de noms informels consiste à utiliser un préfixe partagé, généralement deux
en majuscules. Le framework iOS Foundation utilise "NS" (à partir de
NeXTStep), par exemple. Pour simplifier la version bêta de Google Guava
son nom, un préfixe tel que "GG" améliorerait la lisibilité en faisant référence à Beta
comme GGBeta
.
J2ObjC permet aux développeurs de spécifier leurs propres préfixes à mapper aux noms de packages. Cela se fait sur
la ligne de commande à l'aide de --prefix package=prefix
. Pour raccourcir tous les noms de classe dans
Package de Beta
, "--prefix com.google.common.annotations=GG
" serait utilisé. Un élément
une déclaration de préfixe est requise pour chaque package.
Définir un préfixe unique pour plusieurs packages
Les bibliothèques plus petites ont souvent des noms de classe Java qui ne sont pas contradictoires, et peuvent donc partager un seul préfixe
avec une spécification de package avec des caractères génériques. Par exemple, tous les packages Joda-Time peuvent partager le même préfixe JT, avec --prefix
'org.joda.time.*=JT'
. Le seul caractère générique accepté est "*", qui correspond à la même
le shell de ligne de commande fait
avec les noms de fichiers.
Définir plusieurs préfixes de package
Pour simplifier la spécification de plusieurs définitions de préfixe, un fichier de propriétés peut être utilisé avec la propriété
"--prefixes
fichier" argument:
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>
Classes préfixées au niveau de l'environnement d'exécution
Étant donné que l'application finale comporte des classes avec des préfixes, il est impossible de les localiser à l'aide du code Java d'origine
nom de classe par défaut. Toutefois, si la ressource de l'application contient un fichier nommé prefixes.properties
avec les préfixes utilisés pour la traduction, Class.forName(javaName)
recherche la classe mappée.
Pour ajouter la propriété prefixes.properties ci-dessus à une application iOS dans Xcode, ouvrez les phases de compilation de la cible de compilation développez la section "Copy Bundle Resources" et ajoutez le fichier prefixes.properties à cette liste. La page Java Resources contient de plus amples informations sur la correspondance des concepts de ressources Java avec iOS. ressources.