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 les espaces de noms, contrairement à Objective C++. Pour préserver l'unicité du nom lors de l'utilisation de classes provenant de plusieurs packages, J2ObjC ajoute une version en casse mixte du préfixe au nom du type. Par exemple, java.util.Map est renommé JavaUtilMap.

Malheureusement, les noms de packages en chameau peuvent réduire la lisibilité du code généré, en particulier avec des noms de package longs. Par exemple, l'annotation bêta de Google Guava 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 lettres majuscules. Le framework de base iOS utilise "NS" (de NeXTStep), par exemple. Pour simplifier le nom bêta de Google Guava, un préfixe tel que "GG" améliore la lisibilité en se référant à Beta sous le nom GGBeta.

J2ObjC aide les développeurs à définir leurs propres préfixes à mapper aux noms de packages. Cette opération s'effectue sur la ligne de commande à l'aide de --prefix package=prefix. Pour raccourcir tous les noms de classe du package Beta, "--prefix com.google.common.annotations=GG" sera utilisé. Une déclaration de préfixe distincte est nécessaire pour chaque package.

Définir un préfixe unique pour plusieurs packages

Les bibliothèques plus petites possèdent souvent des noms de classes Java qui n'entrent pas en conflit et qui peuvent donc partager un préfixe unique avec une spécification de package générique. Par exemple, tous les packages Joda-Time peuvent partager le même préfixe JT à l'aide de --prefix 'org.joda.time.*=JT'. Le seul caractère générique accepté est "*", qui correspond à l'interface système de ligne de commande et aux noms de fichiers.

Définir plusieurs préfixes de package

Pour simplifier de spécifier plusieurs définitions de préfixe, un fichier de propriétés peut être utilisé avec l'argument "--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>

Classes avec préfixe au moment de l'exécution

Étant donné que l'application finale comporte des classes avec des préfixes, elles ne peuvent pas être placées par défaut à l'aide du nom de la classe Java d'origine. Toutefois, si l'application contient un fichier nommé prefixes.properties avec ses préfixes utilisés pour la traduction, Class.forName(javaName) trouvera la classe mappée.

Pour ajouter le fichier prefixes.properties ci-dessus à une application iOS dans Xcode, ouvrez l'onglet "Build Phases" de la cible de compilation, développez la section "Copy Bundle Resources" et copiez le fichier prefixes.properties. La page Ressources Java fournit des informations supplémentaires sur la mise en correspondance des concepts de ressources Java et les ressources iOS.