Come specificare i prefissi per i nomi dei pacchetti.

Mappatura dei nomi

Java utilizza i pacchetti per definire in modo informale gli spazi dei nomi, mentre l'obiettivo C++ dispone di spazi dei nomi C++, l'obiettivo C no. Per mantenere l'unicità del nome quando si utilizzano le classi di più pacchetti, J2ObjC antepone una versione del pacchetto con le maiuscole nel cammello al nome del tipo. Ad esempio, il nome java.util.Map è cambiato in JavaUtilMap.

Purtroppo, i nomi dei pacchetti indicati in cammello possono ridurre la leggibilità del codice generato, soprattutto con i nomi di pacchetto lunghi. Ad esempio, l'annotazione beta di Google Guava si trova nel pacchetto com.google.common.annotations e ComGoogleCommonAnnotationsBeta è più difficile da leggere rispetto a Beta.

Definizione di un prefisso di pacchetto

La convenzione Objective-C per definire gli spazi dei nomi informali è l'utilizzo di un prefisso condiviso, generalmente composto da due lettere maiuscole. Ad esempio, iOS Foundation Framework utilizza "NS" (da NeXTStep). Per semplificare il nome della versione beta di Google Guava, un prefisso come "GG" migliorerebbe la leggibilità facendo riferimento a Beta come GGBeta.

J2ObjC supporta gli sviluppatori che specificano i propri prefissi da mappare ai nomi dei pacchetti. utilizzando la riga di comando --prefix package=prefix. Per abbreviare tutti i nomi delle classi nel pacchetto di Beta, verrà utilizzato "--prefix com.google.common.annotations=GG". Per ogni pacchetto è necessaria una dichiarazione di prefisso separata.

Definizione di un singolo prefisso per più pacchetti

Spesso le librerie più piccole hanno nomi di classi Java che non sono in conflitto e quindi possono condividere un singolo prefisso con la specifica del pacchetto con caratteri jolly. Ad esempio, tutti i pacchetti Joda-Time possono condividere lo stesso prefisso JT utilizzando --prefix 'org.joda.time.*=JT'. L'unico carattere jolly supportato è "*", che corrisponde allo stesso modo della shell della riga di comando con i nomi dei file.

Definizione di più prefissi di pacchetti

Per specificare più definizioni di prefissi, è possibile usare un file di proprietà con l'argomento "--prefixes file":

cat prefixes.properties
com.google.common.annotations: GG
com.google.common.base: GG

# While GG can be used for all packages, let's mix it up.
com.google.common.collect: GC
com.google.common.io: GIO        # A prefix can be more than two characters,
com.google.common.net: GuavaNet  # a lot more!
...
j2objc --prefixes prefixes.properties <args>

Classi prefissi in fase di esecuzione

Poiché l'app completata contiene classi con prefissi, non possono essere individuate utilizzando il nome della classe Java originale per impostazione predefinita. Tuttavia, se l'app ha un file denominato prefixs.properties nel suo gruppo di risorse con i prefissi utilizzati per la traduzione, Class.forName(javaName) troverà la classe mappata.

Per aggiungere la funzione prefixs.properties di cui sopra a un'app per iOS in Xcode, apri la scheda Fasi di build della destinazione, espandi la sezione Copia risorse bundle e aggiungi il file prefixs.properties all'elenco. Risorse Java contiene ulteriori informazioni su come i concetti delle risorse Java vengono mappati alle risorse iOS.