Tipos
- Para tipos primitivos, o J2ObjC definiu typedefs no estilo JNI.
- Para tipos de classe típicos, o pacote é escrito em letras maiúsculas e minúsculas e é anexado ao nome da classe.
- Para renomear o prefixo do pacote gerado, consulte Prefixos de pacotes.
- Para o tipo de objeto base e todas as variáveis de tipo, "id" é usado.
- Alguns tipos principais de Java são mapeados para os tipos básicos. (Por exemplo. String como NSString)
- Para os campos declarados como "volatile", J2ObjC tem mais typedefs que usam os tipos C11 _Atomic(...).
- Para tipos internos, o nome da classe interna é anexado ao nome externo com um sublinhado.
Tipo de Java | Tipo Objective-C | Tipo volátil de Objective-C |
---|---|---|
boolean | Booleano | volátil_jbooleano |
char | jchar | volátil_jchar |
byte | jbyte | volátil_jbyte |
short | jshort | volátil_jshort |
int | Jint | volátil_jint |
long | Jlong | volátil_jlong |
float | jfloat | volátil_jfloat |
double | Jdouble | volátil_jdouble |
java.lang.Object | id | ID volátil |
variáveis de tipo | id | ID volátil |
java.lang.String | String NS* | ID volátil |
java.lang.Número | Número de NS* | ID volátil |
java.lang.Cloneable | NSCópia* | ID volátil |
foo.bar.Mumble | FooBarMumble | ID volátil |
foo.bar.Mumber$Inner, | FooBarMumble_Inner* | ID volátil |
Métodos
Os métodos Objective-C diferem dos métodos Java de duas maneiras importantes. Eles são sintaticamente diferentes, incorporando os parâmetros entre os componentes do seletor de método. Os métodos Objective-C não oferecem suporte à sobrecarga, como o Java. Essas diferenças são resolvidas incorporando os tipos de parâmetro ao seletor gerado. Isso é necessário para evitar conflitos de nomes entre métodos Java sobrecarregados.
Há três tipos de métodos Java que diferem na API gerada: métodos de instância, métodos estáticos e construtores. Os métodos de instância são convertidos em métodos de instância de Objective-C. Métodos e construtores estáticos se traduzem em funções de estilo C, mas também adicionam wrappers Objective-C para fornecer uma API mais conhecida para desenvolvedores Objective-C.
Métodos de instância
Os nomes de métodos são gerados da seguinte maneira:
- Os métodos sem parâmetros não foram alterados
- Um ou mais parâmetros usam o seguinte padrão:
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- Regras de palavra-chave de parâmetro:
- Para tipos primitivos, a palavra-chave é o nome em letras maiúsculas do primitivo Java. (Por exemplo. "Cara")
- Para tipos não primitivos, a palavra-chave é o nome do tipo totalmente qualificado com concatenação. (Por exemplo. "ComGoogleFoo")
- Para tipos de matriz, "Array" é anexado à palavra-chave do tipo de elemento.
Exemplo de Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Exemplo de Objective-C
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
Métodos estáticos
Um método de classe Objective-C é adicionado seguindo as mesmas regras de nomenclatura dos métodos da instância.
Uma função em estilo C é adicionada usando as seguintes regras de nomenclatura:
- Comece com o seletor Objective-C. (Por exemplo.
barWithInt:
) - Substitua os dois-pontos por sublinhados. (Por exemplo.
barWithInt_
) - Use um sublinhado antes do nome da classe. (Por exemplo.
ComGoogleFoo_barWithInt_
)
Exemplo de Java
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Exemplo de Objective-C
@interface Foo : NSObject
+ (jboolean)bar;
+ (jdouble)barWithIntArray:(IOSIntArray *)i;
+ (void)barWithNSString:(NSString *)s
withBoolean:(jboolean)b;
@end
FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();
FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);
FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);
Construtores
De acordo com a convenção Objective-C, um método de instância init
é adicionado. Se o construtor tiver
parâmetros, a mesma regra de nomenclatura que os métodos de instância serão usadas.
Três funções no estilo C são adicionadas:
- A primeira função aceita um objeto recém-alocado como o primeiro parâmetro. Essa função normalmente é usada para chamadas a partir de um construtor de subclasse. Isso segue as mesmas regras de nomenclatura de métodos estáticos. (em que "init" é o nome do método)
- Foram adicionadas duas funções que alocam e inicializam o novo objeto. Eles são diferenciados
pelo prefixo:
- A função
create_
retornará um objeto liberado automaticamente. - A função
new_
retornará um objeto retido.
- A função
Exemplo de Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Exemplo de Objective-C
@interface ComGoogleFoo : NSObject
- (instancetype)init;
- (instancetype)initWithId:(id)a
withId:(id)b;
@end
FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();
FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);
Campos
Campos da instância (não estáticos)
As variáveis de instância de Java se tornam variáveis de instância de Objective-C. O nome é o mesmo que tem um sublinhado no final. Os campos primitivos declarados "final" são um caso especial e não são convertidos em variáveis de instância.
- Os campos podem ser acessados diretamente com a sintaxe "->".
- Os campos primitivos podem ser definidos diretamente.
- Os primitivos finais (constantes) são convertidos como constantes estáticas. (consulte Campos estáticos)
- Os campos não primitivos precisam ser definidos usando a função setter fornecida:
ClassName_set_fieldName_(instance, value)
Exemplo de Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Exemplo de Objective-C
Foo *foo = [[Foo alloc] init];
// Access a primitive field.
i = foo->myInt_;
// Set a primitive field.
foo->myInt_ = 5;
// Access a non-primitive field.
NSString *s = foo->myString_;
// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");
Campos estáticos
As variáveis estáticas precisam ser acessadas usando as funções getter e setter fornecidas. Essas funções de acessador garantem que a inicialização da classe tenha ocorrido antes de acessar a variável.
- Acessar um campo estático
ClassName_get_fieldName()
- Atribuir um campo estático (não final)
ClassName_set_fieldName()
- Receber um ponteiro para um campo estático primitivo.
ClassName_getRef_fieldName()
- Disponível apenas para campos não finais e não voláteis.
Os campos primários finais (constantes) são seguros para acesso direto porque o valor deles não depende da inicialização da classe.
ClassName_fieldName
Exemplo de Java
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Exemplo de Objective-C
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT; // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT(); // Class initialization
// Access a primitive field.
i = ComGoogleFoo_get_myInt();
// Set a primitive field.
ComGoogleFoo_set_myInt(5);
// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();
// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");
Enums
O J2ObjC gera dois tipos para cada enumeração Java. Um tipo de classe Objective-C é gerado e oferece a funcionalidade completa de uma enumeração Java. Além disso, uma enumeração C é gerada usando a macro NS_ENUM do framework Foundation. O tipo de classe Objective-C é usado por todas as APIs geradas. A enumeração C é útil como valores constantes para uma instrução switch ou como um tipo de armazenamento.
Os tipos de enumeração gerados são nomeados da seguinte maneira:
- A classe Objective-C é nomeada usando a mesma regra que uma classe Java normal. (consulte Tipos)
- A enumeração C é nomeada como uma classe Java normal com um sufixo "_Enum" adicionado.
As constantes de enumeração são acessadas como campos estáticos.
Exemplo de Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Exemplo de cabeçalho do Objective-C
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
ComGoogleColor_Enum_RED = 0;
ComGoogleColor_Enum_GREEN = 1;
ComGoogleColor_Enum_BLUE = 2;
};
@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end
inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();
// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);