Riferimento per la traduzione

Tipi

  • Per i tipi primitivi, J2ObjC ha definito tipi di definizioni JNI.
  • Per i tipi di classe tipici, il pacchetto è racchiuso in cammelli e anteposto al nome della classe.
  • Per il tipo di oggetto di base e tutte le variabili di tipo viene utilizzato "id".
  • Alcuni tipi di Java di base sono mappati a tipi di base. (ad es. Da stringa a NSString)
  • Per i campi dichiarati come "volatili", J2ObjC ha un numero maggiore di tipi di valori che utilizzano i tipi _Atomic(...) C11.
  • Per i tipi interni, il nome della classe interna viene aggiunto al nome esterno con un trattino basso.
Tipo Java Tipo Objective-C Tipo di volatilità Objective-C
boolean jboolean volatile_jboolean
char jechar volatile_jchar
byte jbyte volatile_jbyte
video breve jshort volatile_jshort
int Jint volatile_jint
lunghi jlong volatile_jlong
numero in virgola mobile JJL volatili_jj
double Doppio volatile_doppia
java.lang.object id ID_volante
variabili di tipo id ID_volante
java.lang.Stringa NSString* ID_volante
java.lang.Number NumeroNS ID_volante
java.lang.cloneable Copia NS* ID_volante
foo.bar.Mumble FooBarmumble* ID_volante
foo.bar.Interni Foo_Mumble_Inner* ID_volante

Metodi

I metodi di tipo Obiettivo-C differiscono da quelli di Java per due aspetti importanti. Sono sintatticamente diversi, incorporando i parametri tra i componenti del selettore di metodi. I metodi Objective-C non supportano il sovraccarico come Java. Queste differenze vengono risolte incorporando i tipi di parametri nel selettore generato. Questo è necessario per evitare conflitti di nome tra metodi Java sovraccarichi.

Esistono tre tipi di metodi Java che differiscono nell'API generata: metodi di istanza, metodi statici e costruttori. I metodi di istanza si traducono in metodi di istanza di Obiettivo C. I metodi e i costruttori statici si traducono in funzioni di stile C, ma aggiungono anche wrapper Objective-C per fornire un'API più familiare agli sviluppatori di Objective-C.

Metodi di istanza

I nomi dei metodi vengono generati come segue:

  • I metodi con zero parametri sono rimasti invariati
  • Uno o più parametri utilizzano il seguente pattern:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • Regole per le parole chiave dei parametri:
    • Per i tipi primitivi, la parola chiave è il nome in maiuscolo della primitiva Java. (ad es. "Caro")
    • Per i tipi non primitivi, la parola chiave è il nome completo del tipo "con cammello". (ad es. "ComGoogleFoo")
    • Per i tipi di array, "Array" viene aggiunto alla parola chiave del tipo di elemento.
Esempio di Java
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Esempio Objective-C
- (void)bar;

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

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

Metodi statici

Un metodo di classe Objective-C viene aggiunto seguendo le stesse regole di denominazione dei metodi delle istanze.

Una funzione di stile C viene aggiunta utilizzando le seguenti regole di denominazione:

  • Inizia con il selettore Objective-C generato. (ad es. barWithInt:)
  • Sostituisci i due punti con i trattini bassi. (ad es. barWithInt_)
  • Anteponi il nome della classe, delimitato da un trattino basso. (ad es. ComGoogleFoo_barWithInt_)
Esempio di Java
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Esempio 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);

Costruttori

In base alla convenzione Objective-C, viene aggiunto un metodo di istanza init. Se il costruttore dispone di parametri, viene utilizzata la stessa regola di denominazione dei metodi di istanza.

Sono state aggiunte tre funzioni di stile C:

  • La prima funzione accetta un oggetto appena assegnato come primo parametro. Questa funzione viene in genere utilizzata per chiamare da un costruttore della sottoclasse. Questa operazione segue le stesse regole di denominazione dei metodi statici. (dove "init" è il nome del metodo)
  • Vengono aggiunte due funzioni che allocano e inizializzano il nuovo oggetto. Si distinguono in base al prefisso:
    • La funzione create_ restituirà un oggetto rilasciato automaticamente.
    • La funzione new_ restituirà un oggetto conservato.
Esempio di Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Esempio 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);

Campi

Campi istanza (non statici)

Le variabili di istanza Java diventano variabili di istanza Objective-C. Il nome è lo stesso con un trattino basso. I campi primitivi dichiarati "finali" sono un caso speciale e non vengono tradotti in variabili di istanza.

  • È possibile accedere ai campi direttamente con la sintassi "->".
  • I campi originari possono essere impostati direttamente.
    • Le primitive finali (costanti) vengono tradotte come costanti statiche. (vedi Campi statici).
  • I campi non primitivi devono essere impostati utilizzando la funzione di impostazione fornita:
    • ClassName_set_fieldName_(instance, value)
Esempio di Java
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Esempio 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");

Campi statici

Le variabili statiche devono essere accessibili utilizzando le funzioni getter e setter fornite. Queste funzioni di accesso garantiscono che l'inizializzazione della classe sia avvenuta prima di accedere alla variabile.

  • Accedere a un campo statico
    • ClassName_get_fieldName()
  • Assegnare un campo statico (non finale)
    • ClassName_set_fieldName()
  • Ottenere un puntatore su un campo statico originario.
    • ClassName_getRef_fieldName()
    • Disponibile solo per i campi non finali e non volatili.

L'accesso diretto ai campi primitivi (costanti) finali è sicuro perché il loro valore non dipende dall'inizializzazione della classe.

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

Enum

J2ObjC genera due tipi per ogni enumerazione Java. Viene generato un tipo di classe Objective-C che fornisce tutte le funzionalità di un'enumerazione Java. Inoltre, viene generata una enumerazione C utilizzando la macro NS_ENUM del framework di Foundation. Il tipo di classe Objective-C viene utilizzato da tutte le API generate. Il enum è utile come valori costanti per un'istruzione switch o come tipo di archiviazione.

I tipi di enumerazione generati hanno il seguente nome:

  • Il nome della classe Objective-C è identico a quello di una classe Java standard. (vedi Tipi).
  • L'enumerazione C è indicata come una normale classe Java con un suffisso "_Enum" aggiunto.

Le costanti Enum sono accessibili come campi statici.

Esempio di Java
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Esempio Intestazione 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);