Mapeamento de nome de classe
Como o J2ObjC traduz apenas classes Java que não são de IU, um aplicativo iOS precisa trabalhar diretamente com as classes traduzidas. As classes traduzidas são classes regulares de Objective-C com base em NSObject, mas ajuda a entender como os nomes de arquivos de classe, método, parâmetro e cabeçalho são convertidos.
O Java usa pacotes para definir namespaces, enquanto Objective-C não tem pacotes e tem uma
convenção de colocar um prefixo compartilhado na frente de classes relacionadas (como NSObject e NSString). Para
preservar namespaces Java, os nomes dos pacotes são mapeados para um prefixo com concatenação. Por exemplo,
java.util.List
é mapeado por padrão para JavaUtilList
. Esse prefixo padrão pode ser definido explicitamente
usando as opções de prefixo de pacote do j2objc.
Nomes de parâmetros
O Java diferencia os métodos sobrecarregados pelos tipos de argumento, enquanto o Objective-C usa nomes de
argumentos. Portanto, o J2ObjC cria nomes de argumentos dos próprios tipos. Por exemplo, veja como um
objeto é inserido no início de um ArrayList
e como essa lista é adicionada a outra
lista:
[someList addWithInt:0 withId:object];
[otherList addAllWithJavaUtilCollection:somelist];
Cada nome de argumento consiste em "with" e o tipo dele. Isso é um pouco feio, mas garante que o mesmo método seja sempre invocado no Objective-C como no Java.
Nomes dos cabeçalhos
No entanto, os nomes dos arquivos de cabeçalho não são mapeados, mas o caminho do arquivo de origem Java termina com ".h" em vez de ".java". Isso facilita muito o suporte a ferramentas como o Xcode e o Make, mas pode ser um pouco confuso no início, já que:
#import "java/util/Date.h"
declara a classe JavaUtilDate
, não Date
.
Como usar classes traduzidas
Além dos nomes ímpares (que podem ser simplificados com prefixos de pacotes), as classes traduzidas são usadas como qualquer outra classe Objective-C:
#import "java/util/BitSet.h"
...
JavaUtilBitSet *bitset = [[JavaUtilBitSet alloc] init];
[bitset setWithInt:10 withBOOL:YES];
BOOL b = [bitset getWithInt:10];