Mapowanie nazw
Java używa pakietów do nieformalnego definiowania przestrzeni nazw. Cel w C++ ma takie przestrzenie nazw, jak C++ – nie. Aby zachować niepowtarzalność nazwy podczas używania klas z wielu pakietów, pakiet J2ObjC dodaje na początku nazwy pakietu wielbłąda. Na przykład java.util.Map
ma teraz nazwę JavaUtilMap
.
Niestety, nazwy pakietów wielbłądów mogą zmniejszać czytelność wygenerowanego kodu, zwłaszcza w przypadku długich nazw pakietów. Na przykład adnotacja Beta Google Guavy znajduje się w pakiecie com.google.common.annotations
, a ComGoogleCommonAnnotationsBeta
jest trudniejszy do odczytania niż Beta
.
Definiowanie prefiksu pakietu
W przypadku konwencjonalnych przestrzeni nazw stosuje się konwencję C – należy używać wspólnego prefiksu (zwykle 2 wielkie litery). iOS Foundation Framework wykorzystuje na przykład „NS” (z NeXTStep). Aby uprościć nazwę wersji beta Google Guava, prefiks, np. „GG”, zwiększy czytelność, ustawiając Beta
jako GGBeta
.
J2ObjC obsługuje programistów określających własne prefiksy mapowania nazw pakietów. Można to zrobić w wierszu poleceń za pomocą polecenia --prefix package=prefix
. Aby skrócić wszystkie nazwy klas z pakietu Beta
, zostanie użyte „--prefix com.google.common.annotations=GG
”. Dla każdego pakietu wymagana jest osobna deklaracja prefiksu.
Definiowanie pojedynczego prefiksu dla wielu pakietów
Mniejsze biblioteki często mają nazwy klas Java, które nie wchodzą w konflikt, co oznacza, że mogą mieć pojedynczy prefiks ze specyfikacją pakietu z symbolem wieloznacznym. Na przykład wszystkie pakiety Joda-Time mogą mieć taki sam prefiks JT przy użyciu --prefix
'org.joda.time.*=JT'
. Jedynym obsługiwanym symbolem wieloznacznym jest znak „*”, który jest zgodny z nazwami plików powłoką wiersza poleceń.
Definiowanie wielu prefiksów pakietów
Aby uprościć określanie kilku definicji prefiksu, można użyć pliku właściwości z argumentem „--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>
Klasy z prefiksem w środowisku wykonawczym
Ukończona aplikacja ma klasy z prefiksami, więc nie można jej domyślnie zlokalizować przy użyciu pierwotnej nazwy klasy Java. Jeśli jednak w aplikacji jest plik o nazwie prefixes.property z prefiksami używanymi do tłumaczenia, Class.forName(javaName)
znajdzie zmapowaną klasę.
Aby dodać powyższe atrybuty prefixes.property do aplikacji na iOS w Xcode, otwórz kartę Etapy kompilacji celu, rozwiń sekcję Zasoby kopiowania i dodaj do niej plik prefixes.property. Zasoby Java zawierają dodatkowe informacje o tym, jak koncepcje zasobów Java są mapowane na zasoby iOS.