Como especificar prefixos para nomes de pacotes.

Mapeamento de nome

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

Infelizmente, os nomes de pacotes com concatenação 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 o prefixo de um pacote

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

O J2ObjC oferece suporte a desenvolvedores que especificam os próprios prefixos para mapear para os nomes de pacotes. Isso é feito na linha de comando usando --prefix package=prefix. Para encurtar todos os nomes de classe no pacote de Beta, o "--prefix com.google.common.annotations=GG" seria usado. Uma declaração de prefixo separada é necessária para cada pacote.

Como definir um único prefixo 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 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 à mesma maneira que o shell da linha de comando com nomes de arquivos.

Como definir vários prefixos de pacote

Para simplificar a definição de várias definições de prefixo, um arquivo de propriedades pode ser usado com o 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>

Classes prefixadas no ambiente de execução

Como o app final tem classes com prefixos, ele não pode ser localizado 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, a Class.forName(javaName) encontrará a classe mapeada.

Para adicionar o prefixes.properties acima a um app iOS no Xcode, abra a guia "Build Phases" do destino, abra a seção "Copy Bundle Resources" e adicione o arquivo prefixes.properties a essa lista. Os recursos Java têm mais informações sobre como os conceitos de recursos Java são mapeados para recursos do iOS.