Referência de tradução

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 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.
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);