Referencia de traducción

Tipos

  • Para los tipos primitivos, J2ObjC definió typedefs de estilo JNI.
  • Para los tipos de clases típicos, el paquete incluye mayúsculas y minúsculas y se antepone al nombre de la clase.
  • Para el tipo de objeto base y todas las variables de tipo, se usa “id”.
  • Algunos tipos principales de Java se asignan a tipos de base. (p. ej., String a NSString)
  • Para los campos declarados como “volatile”, J2ObjC tiene más typedefs que usan tipos _Atomic(...) C11.
  • Para los tipos internos, el nombre de la clase interna se adjunta al nombre externo con un guion bajo.
Tipo de Java Tipo de Objective-C Tipo volátil de Objective-C
boolean jbooleano volátil_jbooleano
char jchar jchar_volátil
byte Jbyte jbyte_volatile
short negro volátil_jshort
int señor volátil_jint
long jlong volátil_jlong
float jfloat volante
double doble doble doble_volátil
java.lang.Object id id_volatile
variables de tipo id id_volatile
java.lang.String NSString* id_volatile
java.lang.Number, Número de NS* id_volatile
java.lang.Clonable Copia de seguridad en red* id_volatile
foo.bar.Mumble FooBarMumble* id_volatile
foo.bar.Mumber$Interior FooBarMumble_Inner* id_volatile

Métodos

Los métodos de Objective-C difieren de los métodos de Java en dos aspectos importantes. Son sintácticamente diferentes, ya que incorporan los parámetros entre los componentes del selector de métodos. Los métodos de Objective-C no admiten la sobrecarga como Java. Estas diferencias se resuelven mediante la incorporación de los tipos de parámetros en el selector generado. Esto es necesario para evitar conflictos de nombres entre los métodos de Java sobrecargados.

Hay tres tipos de métodos de Java que difieren en la API generada: métodos de instancia, métodos estáticos y constructores. Los métodos de instancia se traducen en métodos de instancia de Objective-C. Los constructores y métodos estáticos se traducen en funciones de estilo C, pero también agregan wrappers de Objective-C para proporcionar una API más familiar a los desarrolladores de Objective-C.

Métodos de instancia

Los nombres de métodos se generan de la siguiente manera:

  • Los métodos sin parámetros no se modificaron
  • Uno o más parámetros usan el siguiente patrón:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • Reglas de las palabras clave del parámetro:
    • Para los tipos primitivos, la palabra clave es el nombre en mayúsculas de la primitiva de Java. (p. ej., "Char")
    • Para los tipos no primitivos, la palabra clave es el nombre del tipo calificado completamente en mayúsculas y minúsculas. (p. ej., “ComGoogleFoo”)
    • Para los tipos de arreglo, se agrega "Arreglo" a la palabra clave del tipo de elemento.
Java de ejemplo
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Ejemplo de Objective-C
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

Métodos estáticos

Se agrega un método de clase Objective-C con las mismas reglas de denominación que los métodos de instancia.

Se agrega una función de estilo C mediante las siguientes reglas de denominación:

  • Comienza con el selector Objective-C generado. (p. ej., barWithInt:)
  • Reemplaza los dos puntos con guiones bajos. (p. ej., barWithInt_)
  • Anteponer el nombre de la clase, delimitado por un guion bajo (p. ej., ComGoogleFoo_barWithInt_)
Java de ejemplo
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Ejemplo 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);

Constructores

Siguiendo la convención Objective-C, se agrega un método de instancia init. Si el constructor tiene parámetros, se usa la misma regla de nomenclatura que los métodos de instancia.

Se agregan tres funciones de estilo C:

  • La primera función acepta un objeto recién asignado como su primer parámetro. Por lo general, esta función se usa para llamar desde un constructor de subclase. Esto sigue las mismas reglas de denominación que los métodos estáticos. (Donde "init" es el nombre del método)
  • Se agregan dos funciones que asignan e inicializan el objeto nuevo. Se los distingue por su prefijo:
    • La función create_ mostrará un objeto de lanzamiento automático.
    • La función new_ mostrará un objeto retenido.
Java de ejemplo
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Ejemplo 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 de instancia (no estáticos)

Las variables de instancia de Java se convierten en variables de instancia de Objective-C. El nombre es el mismo con un guion bajo final. Los campos primitivos declarados como “finales” son un caso especial y no se traducen en variables de instancias.

  • Se puede acceder a los campos directamente con la sintaxis "->".
  • Los campos primitivos se pueden configurar directamente.
    • Las primitivas finales (constantes) se traducen como constantes estáticas. (consulta Campos estáticos).
  • Los campos no primitivos deben configurarse con la función de establecedor proporcionada:
    • ClassName_set_fieldName_(instance, value)
Java de ejemplo
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Ejemplo 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

Se debe acceder a las variables estáticas mediante las funciones get y set. Estas funciones de acceso garantizan que se haya iniciado la clase antes de acceder a la variable.

  • Acceder a un campo estático
    • ClassName_get_fieldName()
  • Asignar un campo estático (no final)
    • ClassName_set_fieldName()
  • Obtener un puntero a un campo estático primitivo
    • ClassName_getRef_fieldName()
    • Solo está disponible para campos no finales y no volátiles.

Se puede acceder directamente a los campos primitivos finales (constantes) porque su valor no depende de la inicialización de la clase.

  • ClassName_fieldName
Java de ejemplo
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Ejemplo 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");

Enumeradores

J2ObjC genera dos tipos para cada enumeración de Java. Se genera un tipo de clase Objective-C que proporciona la funcionalidad completa de una enumeración de Java. Además, se genera una enumeración C mediante la macro NS_ENUM del framework de Foundation. Todas las API generadas usan el tipo de clase Objective-C. La enumeración C es útil como valores constantes para una instrucción de cambio o como un tipo de almacenamiento.

Los tipos de enumeración generados se nombran de la siguiente manera:

  • La clase Objective-C se nombra con la misma regla que una clase normal de Java. (consulta Tipos)
  • La enumeración C se nombra como una clase normal de Java con el sufijo "_Enum" agregado.

Se accede a las constantes de enumeración como campos estáticos.

Java de ejemplo
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Ejemplo de encabezado de 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);