Tipos
- Para tipos primitivos, J2ObjC definiu typedefs no estilo JNI.
- Para tipos de classe típicos, o pacote é incluído em camelCase e anexado ao nome da classe.
- Para renomear o prefixo do pacote gerado, consulte Prefixos do pacote.
- Para o tipo de objeto base e todas as variáveis de tipo, "id" é usado.
- Alguns tipos principais de Java são mapeados para tipos de fundação. (Por exemplo. String para NSString)
- Para campos declarados como "voláteis", J2ObjC tem mais typedefs que usam 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 |
---|---|---|
booleano | jboolean | volatile_jboolean |
char | Jchar | volatile_jchar |
byte | Jbyte | volatile_jbyte |
short | jshort | volatile_jshort |
int | Jint | volatile_jint |
long | Jlong | volatile_jlong |
float | jfloat | volatile_jfloat |
double | jdouble | volatile_jdouble |
java.lang.Object | id | volatile_id |
variáveis de tipo | id | volatile_id |
java.lang.String | NSString* | volatile_id |
java.lang.Number | Número NS* | volatile_id |
java.lang.Cloneable | NSCopiando* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
Métodos
Os métodos Objective-C diferem dos métodos Java de duas maneiras importantes. Elas são sintaticamente diferentes, incorporando os parâmetros entre os componentes do seletor de método. Objective-C métodos não aceitam sobrecargas como o Java. Essas diferenças são resolvidas pela incorporação no 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 em sua API gerada: métodos de instância, métodos estáticos métodos e construtores. Os métodos de instância são convertidos em métodos de instância do Objective-C. Estático e construtores se traduzem em funções no estilo C, mas também adiciona wrappers Objective-C ao fornecer uma API mais familiar aos desenvolvedores do Objective-C.
Métodos da instância
Os nomes dos métodos são gerados da seguinte forma:
- Nenhum método de parâmetro permanece inalterado
- 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 do parâmetro:
- Para tipos primitivos, a palavra-chave é o nome em maiúsculas do primitivo Java. (Por exemplo. "Char")
- Para tipos não primitivos, a palavra-chave é o nome do tipo totalmente qualificado em letras concatenadas. (Por exemplo. "ComGoogleFoo")
- Para tipos de matriz, "Array" está 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 de instância.
Uma função em estilo C é adicionada usando as seguintes regras de nomenclatura:
- Comece com o seletor Objective-C gerado. (Por exemplo.
barWithInt:
) - Substitua dois-pontos por sublinhados. (Por exemplo.
barWithInt_
) - Inclua o nome da classe no início, delimitado por um sublinhado. (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
Seguindo a convenção do Objective-C, foi adicionado um método de instância init
. Se o construtor tiver
parâmetros, é usada a mesma regra de nomenclatura dos métodos de instância.
Três funções no estilo C são adicionadas:
- A primeira função aceita um objeto recém-alocado como seu primeiro parâmetro. Essa função é normalmente usado para chamar de um construtor de subclasse. Isso segue as mesmas regras de nomenclatura métodos. (onde "init" é o nome do método)
- Duas funções são adicionadas para alocar e inicializar o novo objeto. Eles são diferenciados
pelo prefixo:
- A função
create_
vai retornar um objeto liberado automaticamente. - A função
new_
vai 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 do Java se tornam variáveis de instância do Objective-C. O nome é o mesmo, com uma extensão sublinhado. Campos primitivos declarados como "finais" são um caso especial e não são convertidos em instâncias variáveis.
- Os campos podem ser acessados diretamente usando "->" .
- Os campos primitivos podem ser definidos diretamente.
- Os primitivos finais (constantes) são convertidos como constantes estáticas. (consulte Campos estáticos)
- Campos não primitivos precisam ser definidos com 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 do acessador garantem que a inicialização da classe tenha ocorrido antes do acesso à 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 primitivos finais (constantes) podem ser acessados com segurança diretamente 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 enum Java. É gerado um tipo de classe Objective-C que fornece a funcionalidade completa de um tipo enumerado Java. Além disso, um tipo enumerado é gerado usando o comando macro NS_ENUM do framework. O tipo de classe Objective-C é usado por todas as APIs geradas. O tipo enumerado C é útil como valores constantes para uma instrução switch ou como um tipo de armazenamento.
Os tipos de tipos enumerados 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 "_Enum" adicionado sufixo.
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 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);