Referência de tradução

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