名前マッピング
Java ではパッケージを使用して名前空間を非公式に定義します。一方、Objective-C++ には C++ 名前空間、
Objective C は違います。複数のパッケージのクラスを使用するときに名前の一意性を維持するには、
J2ObjC は、型名の前にキャメルケース バージョンのパッケージを付加します。たとえば
java.util.Map
の名前が JavaUtilMap
に変更されました。
残念ながら、キャメルケース形式のパッケージ名があると、特に
記述する必要があります。たとえば、Google Guava の
ベータ版アノテーション
com.google.common.annotations
パッケージに含まれているが、ComGoogleCommonAnnotationsBeta
の方が
Beta
より長くなります。
パッケージ接頭辞の定義
非公式の名前空間を定義する Objective-C の慣例では、共通の接頭辞(通常は 2 つ)を使用します。
使用します。iOS Foundation Framework では、「NS」という(
NeXTStep など)を指定します。Google Guava のベータ版を
「GG」などの接頭辞Beta
を GGBeta
と参照することで読みやすさが向上します。
J2ObjC は、デベロッパーが独自の接頭辞を指定してパッケージ名にマッピングすることをサポートしています。これは
--prefix package=prefix
を使用してコマンドラインで実行します。すべてのクラス名を短縮するには、
Beta
のパッケージ「--prefix com.google.common.annotations=GG
」使用されます独立した
接頭辞の宣言がパッケージごとに必要です。
複数のパッケージに対する単一の接頭辞の定義
小規模なライブラリは、多くの場合、競合しない Java クラス名を持つため、1 つの接頭辞を共有できます。
パッケージ仕様のワイルドカードを使用できます。たとえば、--prefix
'org.joda.time.*=JT'
を使用すると、すべての Joda-Time パッケージで同じ JT 接頭辞を共有できます。サポートされているワイルドカード文字は「*」のみです。これは
ファイル名を使用します。
複数のパッケージ接頭辞の定義
複数の接頭辞の定義を簡単に指定するために、
「--prefixes
ファイル」引数:
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>
実行時の接頭辞付きクラス
完成したアプリには接頭辞付きのクラスがあるため、元の Java ではそれらのクラスを見つけることができません
クラス名を使用します。ただし、アプリのリソースに prefixes.properties という名前のファイルがある場合は、
変換に使用する接頭辞を持つバンドルを追加すると、Class.forName(javaName)
はマッピングされたクラスを検索します。
上記の prefixes.properties を Xcode で iOS アプリに追加するには、ビルド ターゲットの [Build Phases] を開きます。 [Copy Bundle Resources] セクションを開き、そのリストに prefixes.properties ファイルを追加します。 Java リソースのコンセプトと iOS のマッピングについては、Java リソースをご覧ください。 説明します。