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 rinominare il prefisso del pacchetto generato, consulta l'articolo Prefissi del pacchetto.
- 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.
- La funzione
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);