Comment spécifier des préfixes pour les noms de packages

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.