Como especificar prefixos para nomes de pacotes.

Mapeamento de nome

O Java usa pacotes para definir namespaces informalmente. enquanto o Objective C++ tem namespaces C++, O Objetivo C não. Para preservar a exclusividade do nome ao usar classes de vários pacotes, J2ObjC adiciona uma versão CamelCase do pacote ao nome do tipo. Por exemplo: java.util.Map foi renomeado como JavaUtilMap.

Infelizmente, os nomes de pacotes com letras concatenadas podem reduzir a legibilidade do código gerado, especialmente com nomes de pacotes longos. Por exemplo, o SDK do Google Guava Anotação Beta está no pacote com.google.common.annotations, e ComGoogleCommonAnnotationsBeta é mais difícil ler do que Beta.

Como definir um prefixo de pacote

A convenção Objective-C para definir namespaces informais é usar um prefixo compartilhado, geralmente dois letras maiúsculas. O iOS Foundation Framework usa "NS" (de NeXTStep), por exemplo. Para simplificar a versão Beta do Google Guava com um nome, como "GG" melhoraria a legibilidade chamando Beta como GGBeta.

O J2ObjC oferece suporte aos desenvolvedores que especificam os próprios prefixos para mapear nomes de pacotes. Isso é feito em a linha de comando usando --prefix package=prefix. Para encurtar todos os nomes de classes em O pacote de Beta, o "--prefix com.google.common.annotations=GG" seriam usados. Um módulo prefixo é necessária para cada pacote.

Como definir um prefixo único para vários pacotes

Bibliotecas menores geralmente têm nomes de classes Java que não entram em conflito e, portanto, podem compartilhar um único prefixo com uma especificação de pacote com caracteres curinga. Por exemplo, todos os pacotes Joda-Time podem compartilhar o mesmo prefixo JT usando --prefix 'org.joda.time.*=JT'. O único caractere curinga aceito é "*", que corresponde à mesma forma que o shell da linha de comando faz com os nomes de arquivos.

Como definir vários prefixos de pacote

Para simplificar a especificação de várias definições de prefixo, é possível usar um arquivo de propriedades com a função "--prefixes arquivo" :

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 com prefixo no ambiente de execução

Como o app final tem classes com prefixos, elas não podem ser localizadas usando o Java original o nome da classe por padrão. No entanto, se o aplicativo tiver um arquivo chamado prefixes.properties no recurso com os prefixos usados para a tradução, Class.forName(javaName) vai encontrar a classe mapeada.

Para adicionar prefixes.properties acima a um app iOS no Xcode, abra as fases de build do destino da compilação. guia, expanda a seção "Copiar recursos do pacote" e adicione o arquivo prefixes.properties a essa lista. A página Recursos Java (link em inglês) tem mais informações sobre como os conceitos de recursos Java são mapeados para iOS do Google Cloud.