Referencia de traducción

Tipos

  • Para los tipos primitivos, J2ObjC definió typedefs de estilo JNI.
  • Para los tipos de clase típicos, el paquete lleva 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, "id" y control sobre el uso de sus datos.
  • Algunos tipos principales de Java se asignan a tipos de base. (p. ej., String a NSString)
  • Para los campos declarados como "volatiles", J2ObjC tiene más typedefs que usan tipos C11 _Atomic(...).
  • Para los tipos internos, el nombre de la clase interna se agrega al nombre externo con un guion bajo.
Tipo de Java Tipo de Objective-C Tipo volátil de Objective-C
boolean jboolean volatile_jboolean
char jchar volatile_jchar
byte jbyte volatile_jbyte
short Jshort volatile_jshort
int tintineo volatile_jint
long Jlong volatile_jlong
float Jfloat volatile_jfloat
doble jduplica volatile_jdouble
java.lang.Object id volatile_id
variables de tipo id volatile_id
java.lang.String NSString* volatile_id
java.lang.Number NSNumber* volatile_id
java.lang.Cloneable NSCopias* volatile_id
foo.bar.Mumble FooBarMumble* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

Métodos

Los métodos de Objective-C difieren de los métodos de Java en dos aspectos importantes. Son sintácticamente diferente, incorporando los parámetros entre componentes del selector de métodos. Objective‐C no admiten la sobrecarga como lo hace Java. Estas diferencias se resuelven incorporando los tipos de parámetros en el selector generado. Esto es necesario para evitar conflictos de nombres sobrecargados de Java.

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

Métodos de instancia

Los nombres de los 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 palabras clave de parámetros:
    • En el caso de los tipos primitivos, la palabra clave es el nombre en mayúsculas del primitivo de Java. (p. ej., "Caracter")
    • Para los tipos no primitivos, la palabra clave es el nombre del tipo completamente calificado con mayúsculas y minúsculas. (p. ej., "ComGoogleFoo")
    • Para los tipos de array, “Array” se agrega a la palabra clave del tipo de elemento.
Ejemplo de Java
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 siguiendo las mismas reglas de nomenclatura que los métodos de instancia.

Se agrega una función de estilo C usando las siguientes reglas de nomenclatura:

  • Comienza con el selector Objective-C generado. (p. ej., barWithInt:
  • Reemplaza los dos puntos por guiones bajos. (p. ej., barWithInt_
  • Antepón el nombre de la clase, delimitado por un guion bajo. (p. ej., ComGoogleFoo_barWithInt_
Ejemplo de Java
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 de 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. Esta función es generalmente se usa para llamar desde un constructor de subclase. Esto sigue las mismas reglas de nomenclatura que las estáticas . (donde "init" es el nombre del método)
  • Se agregan dos funciones que asignarán e inicializarán el nuevo objeto. Se los distingue por su prefijo:
    • La función create_ mostrará un objeto liberado automáticamente.
    • La función new_ mostrará un objeto retenido.
Ejemplo de Java
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, pero guion bajo. Campos primitivos declarados como "finales" son un caso especial y no se traducen a instancias variables.

  • Se puede acceder a los campos directamente con "->". sintaxis.
  • Los campos primitivos se pueden configurar directamente.
    • Las primitivas finales (constantes) se traducen como constantes estáticas. (consulta Campos estáticos)
  • Los campos que no son primitivos se deben configurar usando la función set proporcionada:
    • ClassName_set_fieldName_(instance, value)
Ejemplo de Java
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 proporcionadas. Estas funciones de acceso garantizan que la inicialización de la clase se haya producido antes de acceder a la variable.

  • Accede a un campo estático
    • ClassName_get_fieldName()
  • Asigna un campo estático (no definitivo)
    • ClassName_set_fieldName()
  • Obtén un puntero para un campo estático primitivo
    • ClassName_getRef_fieldName()
    • Solo está disponible para campos no finales y no volátiles.

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

  • ClassName_fieldName
Ejemplo de Java
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");

Enumeraciones

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 enum con la base macro NS_ENUM del framework. Todas las APIs generadas usan el tipo de clase Objective-C. La enumeración C es útiles como valores constantes para una sentencia switch o como tipo de almacenamiento.

Los tipos de enumeración generados tienen el siguiente nombre:

  • El nombre de la clase Objective-C usa la misma regla que una clase Java normal. (consulta la sección Tipos).
  • La enumeración C recibe el nombre de una clase normal de Java con una "_Enum" agregada. .

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

Ejemplo de Java
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);