Cómo especificar prefijos para nombres de paquetes

Asignación de nombre

Java usa paquetes para definir de manera informal los espacios de nombres; mientras que Objective C++ tiene espacios de nombres C++, mientras que Objective C no. Para preservar la singularidad del nombre cuando se usan clases de varios paquetes, J2ObjC antepone una versión del paquete en mayúsculas y minúsculas al nombre del tipo. Por ejemplo, se cambia el nombre de java.util.Map a JavaUtilMap.

Lamentablemente, los nombres de los paquetes con mayúsculas y minúsculas pueden reducir la legibilidad del código generado, en especial, con los nombres de paquetes largos. Por ejemplo, la anotación Beta de Google Guava está en el paquete com.google.common.annotations, y ComGoogleCommonAnnotationsBeta es más difícil de leer que Beta.

Define un prefijo de paquete

La convención Objective-C para definir espacios de nombres informales es usar un prefijo compartido, por lo general, dos letras mayúsculas. Por ejemplo, en el framework de iOS, se usa “NS” (de NeXTStep). Para simplificar el nombre Beta de Google Guava, un prefijo como "GG" mejoraría la legibilidad, ya que haría referencia a Beta como GGBeta.

J2ObjC admite que los desarrolladores especifiquen sus propios prefijos para asignar a los nombres de paquetes. Esto se hace en la línea de comandos mediante --prefix package=prefix. Para acortar todos los nombres de clase del paquete de Beta, se usaría "--prefix com.google.common.annotations=GG". Se necesita una declaración de prefijo independiente para cada paquete.

Define un solo prefijo para varios paquetes

Las bibliotecas más pequeñas a menudo tienen nombres de clase Java que no entran en conflicto, por lo que pueden compartir un solo prefijo con una especificación de paquete de comodín. Por ejemplo, todos los paquetes de Joda-Time pueden compartir el mismo prefijo de JT mediante --prefix 'org.joda.time.*=JT'. El único carácter comodín admitido es “*”, que coincide de la misma manera que lo hace la shell de línea de comandos con los nombres de archivo.

Definir varios prefijos del paquete

Para simplificar la especificación de varias definiciones de prefijos, se puede usar un archivo de propiedades con el argumento “--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>

Clases con prefijo en tiempo de ejecución

Como la app finalizada tiene clases con prefijos, no se pueden ubicar con el nombre de clase original de Java de forma predeterminada. Sin embargo, si la app tiene un archivo llamado prefixes.properties en su paquete de recursos con los prefijos usados para la traducción, Class.forName(javaName) encontrará la clase asignada.

Para agregar los prefixes.properties anteriores a una app para iOS en Xcode, abre la pestaña Fases de compilación del destino de compilación, expande la sección Copiar recursos del paquete y agrega el archivo prefixes.properties a esa lista. En Recursos de Java, encontrarás más información sobre cómo se asignan los conceptos de recursos de Java a los recursos de iOS.