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 Objective C, não. Para preservar a exclusividade do nome ao usar classes de vários pacotes, o J2ObjC prefixa uma versão com letras maiúsculas e minúsculas do pacote ao nome do tipo. Por exemplo, java.util.Map é 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, a anotação Beta do Google Guava está no pacote com.google.common.annotations, e ComGoogleCommonAnnotationsBeta é mais difícil de 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 a 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 classe no pacote Beta, o "--prefix com.google.common.annotations=GG"" seria usado. 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 classe Java que não entram em conflito e, portanto, podem compartilhar um único prefixo com uma especificação de pacote com caractere 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 da mesma forma que o shell de linha de comando com 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 finalizado tem classes com prefixos, elas não podem ser localizadas usando o nome da classe Java original por padrão. No entanto, se o app tiver um arquivo chamado prefixes.properties no pacote de recursos com os prefixos usados para tradução, o Class.forName(javaName) vai encontrar a classe mapeada.

Para adicionar o 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. Recursos Java tem mais informações sobre como os conceitos de recursos Java são mapeados para recursos do iOS.